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

我有一个包含 "账户号码 "和 "卡号 "的数据库。我将这些数据与一个文件相匹配,以 "更新 "任何卡号到账户号码,这样我就只能处理账户号码了。

我创建了一个视图,将表与账户/卡数据库连接起来,以返回 "表ID "和相关的账户号码,现在我需要更新那些ID与账户号码匹配的记录。

这是 "Sales_Import "表,其中的 "账号 "字段需要被更新。

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"。

我相信 "UPDATE FROM "和 "JOIN "会有帮助。

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;
评论(14)

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

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

}。

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

你也可以添加条件来获得特定的数据复制。

评论(2)

对于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汇编了一个列表[这里的报告][1]。

[1]: http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/

评论(10)

为今后的开发人员提供通用的答案。

SQL Server

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

Oracle(和SQL Server)

评论(2)

看来你使用的是MSSQL,那么,如果我没记错的话,是这样做的。

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

我有同样的问题,foo.new 被设置为null</code&gt。 的行设置为foo</code&gt。 中没有匹配键的bar的行,设置为null。 我在Oracle中做了这样的事情。

更新foo
设置foo.new = (选择bar.new)
从酒吧
其中foo.key = bar.key)
其中存在(选择1
从酒吧
其中foo.key = bar.key)
评论(4)

对于PostgreSQL。

UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID; 
评论(0)

对于MySql来说,效果不错。

UPDATE
    Sales_Import SI,RetrieveAccountNumber RAN
SET
    SI.AccountNumber = RAN.AccountNumber
WHERE
    SI.LeadID = RAN.LeadID
评论(0)

这里'是我在SQL Server中的工作原理。

UPDATE [AspNetUsers] SET

[AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
[AspNetUsers].[Name] = [UserProfile].[Name]

FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
评论(1)

谢谢你的答复。我找到了一个解决方案,但是。

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)  
评论(3)

使用下面的查询块,根据ID更新Table1和Table2。

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

这是**解决这个问题的最简单的方法。

评论(0)

如果表在不同的数据库中。 (SQLserver)

update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito

FROM database1..Ciudad c1
 inner join 
  database2..Ciudad c2 on c2.CiudadID=c1.CiudadID
评论(0)

在同一表中更新。

  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
评论(0)

它与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
);
评论(1)

下面有人建议的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的查询都不推荐。 出现NULLs是因为OP将整个数据集与较小的子集进行比较,那么当然会出现匹配问题。 这必须通过编写正确的SQL和正确的 "JOIN "来解决,而不是通过使用 "NOT IN "来躲避问题。 这种情况下使用NOT INNOT EXISTS可能会遇到其他问题。

我投票给最上面的一种,也就是传统的在SQL Server中通过join来更新基于另一张表的方式。 就像我说的,在SQL Server中,你不能在同一个UPDATE语句中使用两个表,除非你先加入它们。

评论(1)

MS Sql

UPDATE  c4 SET Price=cp.Price*p.FactorRate FROM TableNamea_A c4
inner join TableNamea_B p on c4.Calcid=p.calcid 
inner join TableNamea_A cp on c4.Calcid=cp.calcid 
WHERE c4..Name='MyName';

Oracle 11g

        MERGE INTO  TableNamea_A u 
        using
        (
                SELECT c4.TableName_A_ID,(cp.Price*p.FactorRate) as CalcTot 
                FROM TableNamea_A c4
                inner join TableNamea_B p on c4.Calcid=p.calcid 
                inner join TableNamea_A cp on c4.Calcid=cp.calcid 
                WHERE p.Name='MyName' 
        )  rt
        on (u.TableNamea_A_ID=rt.TableNamea_B_ID)
        WHEN MATCHED THEN
        Update set Price=CalcTot  ;
评论(0)

我想这是一个简单的例子可能有人会更容易得到它。

        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
评论(0)

Oracle 11g

merge into Sales_Import
using RetrieveAccountNumber
on (Sales_Import.LeadId = RetrieveAccountNumber.LeadId)
when matched then update set Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber;
评论(0)

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

    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
    )
评论(0)

试试这个:

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
评论(0)