以一对多关系更新子表的最快方法

时间:2014-12-18 19:34:44

标签: sql

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]);

1 个答案:

答案 0 :(得分:0)

使用临时表(我通常使用本地表)最好完成这些任务。只需在一个(或多个)临时表中加载所需的数据,然后使用连接执行一个(或多个)更新,然后就完成了。在执行UPDATE之前,您可以首先将UPDATE作为SELECT运行(使用相同的WHERE子句,但将UPDATE更改为SELECT)只是为了确保UPDATE确实能做正确的事情。

Local and global temporary tables in SQL Server

SQL update query using joins