基于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"。
879
20
我相信 "UPDATE FROM "和 "JOIN "会有帮助。
MS SQL
MySQL和MariaDB
将内容从一个表复制到另一个表的简单方法如下:
}。
你也可以添加条件来获得特定的数据复制。
对于SQL Server 2008 + 使用 "MERGE "而不是专有的 "UPDATE...... "语法有一些吸引力。 FROM`语法有一定的吸引力。
除了是标准的SQL,因此更容易移植之外,它还会在源端有多条连接的记录时引发错误(因此在更新中可能使用多个不同的值),而不是让最终结果不确定。
然而,不幸的是,选择使用哪种方式可能并不完全取决于喜欢的风格。 在SQL Server中,"MERGE "的实现被各种错误所困扰。 Aaron Bertrand汇编了一个列表[这里的报告][1]。
[1]: http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/
为今后的开发人员提供通用的答案。
SQL Server
Oracle(和SQL Server)
看来你使用的是MSSQL,那么,如果我没记错的话,是这样做的。
我有同样的问题,
foo.new
被设置为null</code>。 的行设置为
foo</code>。 中没有匹配键的
bar
的行,设置为null
。 我在Oracle中做了这样的事情。对于PostgreSQL。
对于MySql来说,效果不错。
这里'是我在SQL Server中的工作原理。
谢谢你的答复。我找到了一个解决方案,但是。
使用下面的查询块,根据ID更新Table1和Table2。
这是**解决这个问题的最简单的方法。
如果表在不同的数据库中。 (SQLserver)
在同一表中更新。
它与postgresql一起工作
下面有人建议的SQL,在SQL Server中是行不通的。 这个语法让我想起了我以前上课的时候。
所有其他使用
NOT IN
或NOT EXISTS
的查询都不推荐。 出现NULLs是因为OP将整个数据集与较小的子集进行比较,那么当然会出现匹配问题。 这必须通过编写正确的SQL和正确的 "JOIN "来解决,而不是通过使用 "NOT IN "来躲避问题。 这种情况下使用NOT IN
或NOT EXISTS
可能会遇到其他问题。我投票给最上面的一种,也就是传统的在SQL Server中通过join来更新基于另一张表的方式。 就像我说的,在SQL Server中,你不能在同一个
UPDATE
语句中使用两个表,除非你先加入它们。MS Sql
Oracle 11g
我想这是一个简单的例子可能有人会更容易得到它。
Oracle 11g
这将允许您根据在另一个表中找不到列值来更新表。
这将根据在两个表中找到的列值来更新表。
试试这个: