当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《基于ID匹配从一个表到另一个表的SQL更新》经验,为你挑选了12个好方法。

我有一个带account numbers和的数据库card 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



1> Mark S. Rasm..:

我相信一个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;


这似乎对mssql很好,但似乎不适用于mysql.这似乎可以完成这项工作:`UPDATE Sales_Import,RetrieveAccountNumber SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber,其中Sales_Import.LeadID = RetrieveAccountNumber.LeadID;`.稍微偏离主题,但可能会有所帮助
您可能希望在UPDATE子句中使用表别名,否则如果您在任何时候自己加入表,它将导致问题.
在set子句中,您应该将`SI.AccountNumber`更改为`AccountNumber`,否则它将失败.
我认为没有必要进行内部联接.下面的Vonki解决方案有效:UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] = RetrieveAccountNumber.AccountNumber FROM RetrieveAccountNumber WHERE [Sales_Lead].[dbo].[Sales_Import] .LeadID = RetrieveAccountNumber.LeadID

2> Shivkant..:

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

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

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


这是有效的,但你不需要FROM UPDATE table2中的table2 SET table2.col1 = table1.col1,table2.col2 = table1.col2,... FROM table1 WHERE table1.memberid = table2.memberid
这没有用,但是UPDATE table2,table1 SET table2.col1 = table1.col1,... WHERE table1.memberid = table2.memberid(mysql和phpmyadmin)

3> Martin Smith..:

对于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;

不幸的是,选择哪种使用可能不会纯粹归结为优选的风格.执行MERGESQL Server中已患各种错误.Aaron Bertrand在这里编制了一份报告清单.


抬头为'MERGE`.
我从来不知道合并语法.它比Update + Join更清洁.

4> Tigerjz32..:

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

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;


Oracle版本不起作用。正在获取ORA-00933

5> Vinko Vrsalo..:

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

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



6> Kjell Andrea..:

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)


因为foo中没有匹配的每一行最终都为null,因为select语句产生了null.希望这比我第一次尝试解释它更清楚.
为什么需要*WHERE EXISTS*?

7> petter..:

对于PostgreSQL:

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



8> 小智..:

对于工作正常的MySql:

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



9> Abhimanyu..:

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

UPDATE [AspNetUsers] SET

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

FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];



10> 小智..:

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

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)  


无论代码是否有效,您都应该看看发布的其他两个解决方案.它们更清晰,更不容易出错,而且几乎肯定更快.
关于此解决方案的一个注释,UPDATE ... FROM是专有的,因此,如果由于使用的是SQL 2005或更早版本而无法使用MERGE语句,则这是一种符合ANSI标准的方法,可以使用MSSQL中的表源执行更新.资料来源:http://sqlblog.com/blogs/hugo_kornelis/archive/2008/03/10/lets-deprecate-update-from.aspx

11> Gil Baggio..:

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

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

这是解决此问题的最简单方法



12> 小智..:

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

update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito

FROM database1..Ciudad c1
 inner join 
  database2..Ciudad c2 on c2.CiudadID=c1.CiudadID

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有