[英]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.