SQL根据ID匹配从一个表更新到另一个表

我有一个数据库帐号和卡号。 我将这些匹配到一个文件来更新任何卡号到帐号,所以我只使用帐号。

我创build了一个链接表和账户/卡数据库的视图来返回表ID和相关的账号,现在我需要更新那些账号与账号相匹配的logging。

这是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) 

它将卡号更新为帐号,但帐号被NULLreplace

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

不幸的是,select使用哪一个可能不会纯粹地归结为偏爱的风格。 在SQL Server中MERGE的实现已经受到各种错误的困扰。 Aaron Bertrand在这里汇编了一份报告的清单。

似乎你正在使用MSSQL,然后,如果我没有记错,它是这样做的:

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

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

更新foo
设置foo.new =(selectbar.new
                  从酒吧 
                  其中foo.key = bar.key)
哪里存在(select1
              从酒吧
              其中foo.key = bar.key)

未来开发者的通用答案。

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; 

对于PostgreSQL:

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

对于MySql工作正常:

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

对于MySql

 UPDATE table1 JOIN table2 ON table1.id = table2.id SET table1.name = table2.name, table1.`desc` = table2.`desc` 

对于Sql Server

 UPDATE table1 SET table1.name = table2.name, table1.[desc] = table2.[desc] FROM table1 JOIN table2 ON table1.id = table2.id 

我已经使用以上所有的查询,但他们不工作; 当我使用这个时,就完成了。

你也可以从这里赶上它, https://stackoverflow.com/questions/5036918/update-one-table-with-data-from-another

希望你明白。 谢谢

感谢您的回应。 我find了一个解决scheme。

 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) 

在同一个表内更新:

  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 

有人build议下面的SQL,在SQL Server中不起作用。 这句话让我想起了我的老同学:

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

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

我的投票是最上面的一个,这是通过joinSQL Server基于另一个表更新表的传统方式。 就像我所说的,除非先join它们,否则不能在SQL Server的同一个UPDATE语句中使用两个表。

它适用于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 ); 

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

  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 

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

  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 ) 

这将根据在两个表中find的列值来更新表格。

  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 ) 

尝试这个 :

 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 

我想添加一个额外的东西。

不要使用相同的值更新值,会产生额外的日志logging和不必要的开销。 看下面的例子 – 它将只执行2条logging上的更新,尽pipe链接在3上。

 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 

我想为Access SQL或VBA代码添加此更新:我们必须在SET之前执行JOIN。

访问SQL

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

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

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

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