繁体   English   中英

通过使用SQL Server中的联接多个表来选择并更新表中的行

[英]Select and update on the rows in a table by using joins multiple table in SQL Server

我正在尝试更新具有通过旧版应用程序错误地插入了数据的表中的120万行。 我不是很擅长编写高效的SQL查询,因为这是我第一次遇到这类较大的数据集。

我已编写如下查询,并且运行此查询需要很长时间。 我已经在声明中注释了我的更新逻辑。

SELECT T1.Old_id,
       T1. Report_id,
       T2.New_id /* update a set file_id = T2.new_id*/
FROM
  (SELECT A.File_id AS Old_id,
          A.Id AS Report_id,
          A.User_id AS USER
   FROM A
   INNER JOIN B ON A.Id = B.A_id
   INNER JOIN C ON B.Id = C. B_id
   INNER JOIN D ON C.Id = D.C_id
   INNER JOIN E ON D.Id = E.D_id
   WHERE E.Name = 'student_report') AS T1
LEFT JOIN
  (SELECT Max(C.Report_id) AS New_id,
          C.Created_by AS User_id
   FROM C
   INNER JOIN D ON C.Id = D.C_id
   INNER JOIN E ON D.Id = E.D_id
   WHERE E.Name = 'teacher_report'
   GROUP BY C.Created_by) ON T1.User_id = T2.User_id /* where a.id = T1.report_id*/

我需要通过c的report_id更新表a中的file_id。 使用少量数据,select查询可以正常工作并按预期给出结果。 但是,在拥有120万行的服务器上,这需要花费很长时间。

有没有一种方法可以将这两个子查询合而为一,并使其适用于“更新”? 因为,更新也会失败,因为第二个子查询上具有“ group by”。

请使用执行计划分析查询成本。 检查延迟的表,然后检查是否为该特定表使用了正确的索引。

在此处输入图片说明

主要问题是在联接条件下使用Subquery

第二个问题,当同一结果集要多次使用时,应将通用结果集放在CTE#temp表中。

    create table #temp(B_id int,cTeport_id int,cUserID int,EName varchar(100))

   insert into #temp
   select B_id,C.Report_id,C.Created_by,E.Name
   INNER JOIN C ON B.Id = C. B_id
   INNER JOIN D ON C.Id = D.C_id
   INNER JOIN E ON D.Id = E.D_id
    WHERE E.Name in( 'teacher_report','student_report')

    ;With CTE as
    (
        SELECT Max(C.Report_id) AS New_id,
          C.Created_by AS User_id
   FROM #temp c
     WHERE c.Name = 'teacher_report'
     GROUP BY C.Created_by
    )

    SELECT T1.Old_id,
       T1. Report_id,
       T2.New_id /* update a set file_id = T2.new_id*/
FROM
  (SELECT A.File_id AS Old_id,
          A.Id AS Report_id,
          A.User_id AS USER
   FROM A
   INNER JOIN B ON A.Id = B.A_id
   INNER JOIN #temp t ON B.Id = t. B_id
   WHERE t.Name = 'student_report'
   and exists(select 1 from cte t1 T1.User_id = T.User_id)

我的脚本未经测试,因此您可以修复任何小错误(如有)。

在“ Temp table仔细定义此查询所需的所有列及其datatype

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM