我有一个 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
替换
19 回答
在同一个表中更新:
将内容从一个表复制到另一个表的简单方法如下:
您还可以添加条件以复制特定数据 .
我有同样的问题,
foo.new
被设置为null
,foo
的行在bar
中没有匹配的键 . 我在Oracle中做过类似的事情:我想补充一点 .
不要使用相同的值更新值,它会生成额外的日志记录和不必要的开销 . 请参阅下面的示例 - 尽管链接在3上,它仍将仅对2条记录执行更新 .
对于PostgreSQL:
它适用于postgresql
这将允许您根据在另一个表中找不到的列值更新表 .
这将根据在两个表中找到的列值更新表 .
这是在SQL Server中对我有用的:
看来你正在使用MSSQL,那么,如果我没记错的话,它是这样完成的:
对于运行良好的MySql:
try this :
使用以下查询块根据ID更新Table1和Table2:
这是解决这个问题的 easiest way .
对于SQL Server 2008使用
MERGE
而不是专有的UPDATE ... FROM
语法有一些吸引力 .除了作为标准SQL并因此更具可移植性之外,如果源端存在多个连接行(因此在更新中使用多个可能的不同值)而不是使最终结果不确定,它也会引发错误 .
不幸的是,选择哪种使用可能不会纯粹归结为优选的风格 . SQL Server中
MERGE
的实现受到各种错误的影响 . Aaron Bertrand编制了一份the reported ones here清单 .谢谢你的回复 . 我发现了一个解决方案 .
如果以上答案不适合你,试试这个
以下SQL有人建议,在SQL Server中不起作用 . 这个语法让我想起了我的旧学校课程:
建议不要使用
NOT IN
或NOT EXISTS
的所有其他查询 . 出现NULL因为OP将整个数据集与较小的子集进行比较,当然会出现匹配问题 . 这必须通过使用正确的JOIN
编写正确的SQL而不是使用NOT IN
避免躲避问题来解决 . 在这种情况下,您可能会使用NOT IN
或NOT EXISTS
来遇到其他问题 .我对前一种投票,这是通过加入SQL Server来更新基于另一个表的表的传统方法 . 就像我说的,你不能在SQL Server中的同一个
UPDATE
语句中使用两个表,除非你先加入它们 .我相信
UPDATE FROM
与JOIN
会有所帮助:MS SQL
MySQL和MariaDB
我认为这是一个简单的例子,可能有人会让它更容易,
未来开发人员的通用答案 .
SQL Server
Oracle(和SQL Server)
MySQL