首页 文章

基于ID匹配从一个表到另一个表的SQL更新

提问于
浏览
784

我有一个 account numberscard numbers 的数据库 . 我将这些匹配到一个文件 update 任何卡号到帐号,这样我只使用帐号 .

我创建了一个视图链接表到帐户/卡数据库以返回 Table ID 和相关的帐号,现在我需要更新ID与帐号匹配的记录 .

这是 Sales_Import 表,需要更新 account number 字段:

LeadID  AccountNumber
147         5807811235
150         5807811326
185         7006100100007267039

这是 RetrieveAccountNumber 表,我需要更新:

LeadID  AccountNumber
147         7006100100007266957
150         7006100100007267039

我尝试了以下,但到目前为止没有运气:

UPDATE [Sales_Lead].[dbo].[Sales_Import] 
SET    [AccountNumber] = (SELECT RetrieveAccountNumber.AccountNumber 
                          FROM   RetrieveAccountNumber 
                          WHERE  [Sales_Lead].[dbo].[Sales_Import]. LeadID = 
                                                RetrieveAccountNumber.LeadID)

它将卡号更新为帐号,但帐号被 NULL 替换

19 回答

  • 2

    在同一个表中更新:

    DECLARE @TB1 TABLE
        (
            No Int
            ,Name NVarchar(50)
            ,linkNo int
        )
    
        DECLARE @TB2 TABLE
        (
            No Int
            ,Name NVarchar(50)
            ,linkNo int
        )
    
        INSERT INTO @TB1 VALUES(1,'changed person data',  0);
        INSERT INTO @TB1 VALUES(2,'old linked data of person', 1);
    
    INSERT INTO @TB2 SELECT * FROM @TB1 WHERE linkNo = 0
    
    
    SELECT * FROM @TB1
    SELECT * FROM @TB2
    
    
        UPDATE @TB1 
            SET Name = T2.Name
        FROM        @TB1 T1
        INNER JOIN  @TB2 T2 ON T2.No = T1.linkNo
    
        SELECT * FROM @TB1
    
  • 3

    将内容从一个表复制到另一个表的简单方法如下:

    UPDATE table2 
    SET table2.col1 = table1.col1, 
    table2.col2 = table1.col2,
    ...
    FROM table1, table2 
    WHERE table1.memberid = table2.memberid
    

    您还可以添加条件以复制特定数据 .

  • 3

    我有同样的问题, foo.new 被设置为 nullfoo 的行在 bar 中没有匹配的键 . 我在Oracle中做过类似的事情:

    update foo
    set    foo.new = (select bar.new
                      from bar 
                      where foo.key = bar.key)
    where exists (select 1
                  from bar
                  where foo.key = bar.key)
    
  • -1

    我想补充一点 .

    不要使用相同的值更新值,它会生成额外的日志记录和不必要的开销 . 请参阅下面的示例 - 尽管链接在3上,它仍将仅对2条记录执行更新 .

    DROP TABLE #TMP1
    DROP TABLE #TMP2
    CREATE TABLE #TMP1(LeadID Int,AccountNumber NVarchar(50))
    CREATE TABLE #TMP2(LeadID Int,AccountNumber NVarchar(50))
    
    INSERT INTO #TMP1 VALUES
    (147,'5807811235')
    ,(150,'5807811326')
    ,(185,'7006100100007267039');
    
    INSERT INTO #TMP2 VALUES
    (147,'7006100100007266957')
    ,(150,'7006100100007267039')
    ,(185,'7006100100007267039');
    
    UPDATE A
    SET A.AccountNumber = B.AccountNumber
    FROM
        #TMP1 A 
            INNER JOIN #TMP2 B
            ON
            A.LeadID = B.LeadID
    WHERE
        A.AccountNumber <> B.AccountNumber  --DON'T OVERWRITE A VALUE WITH THE SAME VALUE
    
    SELECT * FROM #TMP1
    
  • 54

    对于PostgreSQL:

    UPDATE Sales_Import SI
    SET AccountNumber = RAN.AccountNumber
    FROM RetrieveAccountNumber RAN
    WHERE RAN.LeadID = SI.LeadID;
    
  • 27

    它适用于postgresql

    UPDATE application
    SET omts_received_date = (
        SELECT
            date_created
        FROM
            application_history
        WHERE
            application.id = application_history.application_id
        AND application_history.application_status_id = 8
    );
    
  • 1172

    这将允许您根据在另一个表中找不到的列值更新表 .

    UPDATE table1 SET table1.column = 'some_new_val' WHERE table1.id IN (
                SELECT * 
                FROM (
                        SELECT table1.id
                        FROM  table1 
                        LEFT JOIN table2 ON ( table2.column = table1.column ) 
                        WHERE table1.column = 'some_expected_val'
                        AND table12.column IS NULL
                ) AS Xalias
        )
    

    这将根据在两个表中找到的列值更新表 .

    UPDATE table1 SET table1.column = 'some_new_val' WHERE table1.id IN (
                SELECT * 
                FROM (
                        SELECT table1.id
                        FROM  table1 
                        JOIN table2 ON ( table2.column = table1.column ) 
                        WHERE table1.column = 'some_expected_val'
                ) AS Xalias
        )
    
  • 2

    这是在SQL Server中对我有用的:

    UPDATE [AspNetUsers] SET
    
    [AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
    [AspNetUsers].[Name] = [UserProfile].[Name]
    
    FROM [AspNetUsers], [UserProfile]
    WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
    
  • 33

    看来你正在使用MSSQL,那么,如果我没记错的话,它是这样完成的:

    UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] = 
    RetrieveAccountNumber.AccountNumber 
    FROM RetrieveAccountNumber 
    WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
    
  • 1

    对于运行良好的MySql:

    UPDATE
        Sales_Import SI,RetrieveAccountNumber RAN
    SET
        SI.AccountNumber = RAN.AccountNumber
    WHERE
        SI.LeadID = RAN.LeadID
    
  • -2

    try this :

    UPDATE
        Table_A
    SET
        Table_A.AccountNumber = Table_B.AccountNumber ,
    FROM
        dbo.Sales_Import AS Table_A
        INNER JOIN dbo.RetrieveAccountNumber AS Table_B
            ON Table_A.LeadID = Table_B.LeadID 
    WHERE
        Table_A.LeadID = Table_B.LeadID
    
  • -2

    使用以下查询块根据ID更新Table1和Table2:

    UPDATE Sales_Import, RetrieveAccountNumber 
    SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber 
    where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;
    

    这是解决这个问题的 easiest way .

  • -1

    对于SQL Server 2008使用 MERGE 而不是专有的 UPDATE ... FROM 语法有一些吸引力 .

    除了作为标准SQL并因此更具可移植性之外,如果源端存在多个连接行(因此在更新中使用多个可能的不同值)而不是使最终结果不确定,它也会引发错误 .

    MERGE INTO Sales_Import
       USING RetrieveAccountNumber
          ON Sales_Import.LeadID = RetrieveAccountNumber.LeadID
    WHEN MATCHED THEN
       UPDATE 
          SET AccountNumber = RetrieveAccountNumber.AccountNumber;
    

    不幸的是,选择哪种使用可能不会纯粹归结为优选的风格 . SQL Server中 MERGE 的实现受到各种错误的影响 . Aaron Bertrand编制了一份the reported ones here清单 .

  • 149

    谢谢你的回复 . 我发现了一个解决方案 .

    UPDATE Sales_Import 
    SET    AccountNumber = (SELECT RetrieveAccountNumber.AccountNumber 
                              FROM   RetrieveAccountNumber 
                              WHERE  Sales_Import.leadid =RetrieveAccountNumber.LeadID) 
    WHERE Sales_Import.leadid = (SELECT  RetrieveAccountNumber.LeadID 
                                 FROM   RetrieveAccountNumber 
                                 WHERE  Sales_Import.leadid = RetrieveAccountNumber.LeadID)
    
  • 14

    如果以上答案不适合你,试试这个

    Update Sales_Import A left join RetrieveAccountNumber B on A.LeadID = B.LeadID
    Set A.AccountNumber = B.AccountNumber
    where A.LeadID = B.LeadID
    
  • 262

    以下SQL有人建议,在SQL Server中不起作用 . 这个语法让我想起了我的旧学校课程:

    UPDATE table2 
    SET table2.col1 = table1.col1, 
    table2.col2 = table1.col2,
    ...
    FROM table1, table2 
    WHERE table1.memberid = table2.memberid
    

    建议不要使用 NOT INNOT EXISTS 的所有其他查询 . 出现NULL因为OP将整个数据集与较小的子集进行比较,当然会出现匹配问题 . 这必须通过使用正确的 JOIN 编写正确的SQL而不是使用 NOT IN 避免躲避问题来解决 . 在这种情况下,您可能会使用 NOT INNOT EXISTS 来遇到其他问题 .

    我对前一种投票,这是通过加入SQL Server来更新基于另一个表的表的传统方法 . 就像我说的,你不能在SQL Server中的同一个 UPDATE 语句中使用两个表,除非你先加入它们 .

  • 1

    我相信 UPDATE FROMJOIN 会有所帮助:

    MS SQL

    UPDATE
        Sales_Import
    SET
        Sales_Import.AccountNumber = RAN.AccountNumber
    FROM
        Sales_Import SI
    INNER JOIN
        RetrieveAccountNumber RAN
    ON 
        SI.LeadID = RAN.LeadID;
    

    MySQL和MariaDB

    UPDATE
        Sales_Import SI,
        RetrieveAccountNumber RAN
    SET
        SI.AccountNumber = RAN.AccountNumber
    WHERE
        SI.LeadID = RAN.LeadID;
    
  • 26

    我认为这是一个简单的例子,可能有人会让它更容易,

    DECLARE @TB1 TABLE
            (
                No Int
                ,Name NVarchar(50)
            )
    
            DECLARE @TB2 TABLE
            (
                No Int
                ,Name NVarchar(50)
            )
    
            INSERT INTO @TB1 VALUES(1,'asdf');
            INSERT INTO @TB1 VALUES(2,'awerq');
    
    
            INSERT INTO @TB2 VALUES(1,';oiup');
            INSERT INTO @TB2 VALUES(2,'lkjhj');
    
            SELECT * FROM @TB1
    
            UPDATE @TB1 SET Name =S.Name
            FROM @TB1 T
            INNER JOIN @TB2 S
                    ON S.No = T.No
    
            SELECT * FROM @TB1
    
  • 28

    未来开发人员的通用答案 .

    SQL Server

    UPDATE 
         t1
    SET 
         t1.column = t2.column
    FROM 
         Table1 t1 
         INNER JOIN Table2 t2 
         ON t1.id = t2.id;
    

    Oracle(和SQL Server)

    UPDATE 
         t1
    SET 
         t1.colmun = t2.column 
    FROM 
         Table1 t1, 
         Table2 t2 
    WHERE 
         t1.ID = t2.ID;
    

    MySQL

    UPDATE 
         Table1 t1, 
         Table2 t2
    SET 
         t1.column = t2.column 
    WHERE
         t1.ID = t2.ID;
    

相关问题