协慌网

登录 贡献 社区

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

我有一个包含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替换

答案

我相信通过JOIN进行UPDATE FROM将有助于:

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;

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

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

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

对于 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 在这里编制了一份报告清单。