SQL:
SELECT [U].[FirstName]
, [U].[LastName]
, [U].[Email]
, [U].[UserId]
, [AHI].[Id] AS [AdHocId]
, [R].[AgentId]
, [R].[RsvpId]
, [RC].[AgentId] AS [CertAgentId]
, [RC].[CertId]
FROM [dbo].[Users] AS U
LEFT JOIN [dbo].[AdHocIdentity] AS AHI
ON [AHI].[Email] = [TUI].[Email]
LEFT JOIN [dbo].[Rsvp] AS R
ON [R].[AgentId] = [AHI].[Id]
LEFT JOIN [dbo].[Certificates] AS RC
ON [RC].[RsvpId] = [R].[RsvpId]
WHERE [AHI].[Email] IS NOT NULL
AND [R].[Completed] = 1
AND ( [AHI].[Email] LIKE '%@%' )
ORDER BY [AHI].[Email]
输出:
FirstName LastName Email UserId AdHocId AgentId RsvpId CertAgentId CertId Babs Robespiere babsrobes@yahoo.com 5950B6AB-E2F0-4923-BA45-7AD843D6937F 71283531-90E6-4570-813B-5B1C706030B8 71283531-90E6-4570-813B-5B1C706030B8 03A99511-7FE1-4D8F-B2FB-59E8302FD531 71283531-90E6-4570-813B-5B1C706030B8 FECE9E84-ECE3-4B78-AC2E-A726CCCC8B13 Babs Robespiere babsrobes@yahoo.com 5950B6AB-E2F0-4923-BA45-7AD843D6937F 5950B6AB-E2F0-4923-BA45-7AD843D6937F 5950B6AB-E2F0-4923-BA45-7AD843D6937F DD29555E-EE06-4724-8FCD-B825AECDCC82 5950B6AB-E2F0-4923-BA45-7AD843D6937F 9E46C992-4CB4-453E-A4D0-BD16587235CA
目标:
我想更新证书(RC).AgentId(CertAgentId)和Rsvp(r).AgentId以匹配用户(u).UserId。它将呈现如下输出:
FirstName LastName Email UserId AdHocId AgentId RsvpId CertAgentId CertId Babs Robespiere babsrobes@yahoo.com 5950B6AB-E2F0-4923-BA45-7AD843D6937F 5950B6AB-E2F0-4923-BA45-7AD843D6937F 5950B6AB-E2F0-4923-BA45-7AD843D6937F 03A99511-7FE1-4D8F-B2FB-59E8302FD531 5950B6AB-E2F0-4923-BA45-7AD843D6937F FECE9E84-ECE3-4B78-AC2E-A726CCCC8B13 Babs Robespiere babsrobes@yahoo.com 5950B6AB-E2F0-4923-BA45-7AD843D6937F 5950B6AB-E2F0-4923-BA45-7AD843D6937F 5950B6AB-E2F0-4923-BA45-7AD843D6937F DD29555E-EE06-4724-8FCD-B825AECDCC82 5950B6AB-E2F0-4923-BA45-7AD843D6937F 9E46C992-4CB4-453E-A4D0-BD16587235CA
我最初的想法是呻吟,因为我在光标中设想了一个光标,在所有用户的外部循环,在内部循环到所有的Rsvps。
但那会很难看,也很烦人。
是的,这是“一次性”运行以更新新导入的数据 - 因此不是预定的持续运行。
更新 答案是:
/* Update RSVPs */
UPDATE SRR
SET [AgentId] = [U].[UserId]
FROM [dbo].[Users] AS U
LEFT JOIN [dbo].[AdHocIdentity] AS AHI
ON [AHI].[Email] = [U].[Email]
LEFT JOIN [dbo].[Rsvp] AS R
ON [R].[AgentId] = [AHI].[Id]
WHERE [AHI].[Email] IS NOT NULL
AND ( [AHI].[Email] LIKE '%@%' )
AND ([U].[UserId] != [R].[AgentId]);
/* Update Certs */
UPDATE SRC
SET [AgentId] = [U].[UserId]
FROM [dbo].[Users] AS U
LEFT JOIN [dbo].[AdHocIdentity] AS AHI
ON [AHI].[Email] = [U].[Email]
LEFT JOIN [dbo].[Certificates] AS C
ON [C].[AgentId] = [AHI].[Id]
WHERE [AHI].[Email] IS NOT NULL
AND ( [AHI].[Email] LIKE '%@%' )
AND ([U].[UserId] != [C].[AgentId]);
答案 0 :(得分:0)
使用临时表(我通常使用本地表)最好完成这些任务。只需在一个(或多个)临时表中加载所需的数据,然后使用连接执行一个(或多个)更新,然后就完成了。在执行UPDATE之前,您可以首先将UPDATE作为SELECT运行(使用相同的WHERE子句,但将UPDATE更改为SELECT)只是为了确保UPDATE确实能做正确的事情。