sql - sql基于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) 

它将卡号更新为帐号,但账户号被替换为空

时间:

我相信一个 UPDATE FROMJOIN 将帮助:


UPDATE
 Sales_Import
SET
 Sales_Import.AccountNumber = RAN.AccountNumber
FROM
 Sales_Import SI
INNER JOIN
 RetrieveAccountNumber RAN
ON 
 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,从而更方便也会提高一个错误事件的存在多个加入行源端的undeterministic ( 从而在更新中使用多个可能的不同值) 而不是最终结果。


MERGE INTO Sales_Import
 USING RetrieveAccountNumber
 ON Sales_Import.LeadID = RetrieveAccountNumber.LeadID
WHEN MATCHED THEN
 UPDATE 
 SET AccountNumber = RetrieveAccountNumber.AccountNumber;

不幸的是,使用哪个选项可能不会完全归结为首选风格。 MERGE 在 SQL Server 中的实现受到各种 Bug的影响。 Aaron 。Bertrand已经在这里编译了一个的列表。

看来你使用的是 ms - dos,如果我记错了,就像这样做:


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

我有同样的问题与 foo.new 被设置为行 nullfoobar 没有匹配的关键。 我在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)

感谢你的答复。我找到了一个解决方案。


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

我觉得这是个简单的例子,让人更容易


 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

...