我有一个包含 "账户号码 "和 "卡号 "的数据库。我将这些数据与一个文件相匹配,以 "更新 "任何卡号到账户号码,这样我就只能处理账户号码了。
我创建了一个视图,将表与账户/卡数据库连接起来,以返回 "表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"。
我相信 "UPDATE FROM "和 "JOIN "会有帮助。
UPDATE
Sales_Import
SET
Sales_Import.AccountNumber = RAN.AccountNumber
FROM
Sales_Import SI
INNER JOIN
RetrieveAccountNumber RAN
ON
SI.LeadID = RAN.LeadID;
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
}。
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;
然而,不幸的是,选择使用哪种方式可能并不完全取决于喜欢的风格。 在SQL Server中,"MERGE "的实现被各种错误所困扰。 Aaron Bertrand汇编了一个列表[这里的报告][1]。
[1]: http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/
为今后的开发人员提供通用的答案。
UPDATE
t1
SET
t1.column = t2.column
FROM
Table1 t1
INNER JOIN Table2 t2
ON t1.id = t2.id;
UPDATE
t1
SET
t1.colmun = t2.column
FROM
Table1 t1,
Table2 t2
WHERE
t1.ID = t2.ID;
UPDATE
Table1 t1,
Table2 t2
SET
t1.column = t2.column
WHERE
t1.ID = t2.ID;
谢谢你的答复。我找到了一个解决方案,但是。
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)
使用下面的查询块,根据ID更新Table1和Table2。
UPDATE Sales_Import, RetrieveAccountNumber
SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber
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
它与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
);
下面有人建议的SQL,在SQL Server中是行不通的。 这个语法让我想起了我以前上课的时候。
UPDATE table2
SET table2.col1 = table1.col1,
table2.col2 = table1.col2,
...
FROM table1, table2
WHERE table1.memberid = table2.memberid
所有其他使用NOT IN
或NOT EXISTS
的查询都不推荐。
出现NULLs是因为OP将整个数据集与较小的子集进行比较,那么当然会出现匹配问题。
这必须通过编写正确的SQL和正确的 "JOIN "来解决,而不是通过使用 "NOT IN "来躲避问题。
这种情况下使用NOT IN
或NOT EXISTS
可能会遇到其他问题。
我投票给最上面的一种,也就是传统的在SQL Server中通过join来更新基于另一张表的方式。
就像我说的,在SQL Server中,你不能在同一个UPDATE
语句中使用两个表,除非你先加入它们。
MS Sql
UPDATE c4 SET Price=cp.Price*p.FactorRate FROM TableNamea_A c4
inner join TableNamea_B p on c4.Calcid=p.calcid
inner join TableNamea_A cp on c4.Calcid=cp.calcid
WHERE c4..Name='MyName';
Oracle 11g
MERGE INTO TableNamea_A u
using
(
SELECT c4.TableName_A_ID,(cp.Price*p.FactorRate) as CalcTot
FROM TableNamea_A c4
inner join TableNamea_B p on c4.Calcid=p.calcid
inner join TableNamea_A cp on c4.Calcid=cp.calcid
WHERE p.Name='MyName'
) rt
on (u.TableNamea_A_ID=rt.TableNamea_B_ID)
WHEN MATCHED THEN
Update set Price=CalcTot ;
我想这是一个简单的例子可能有人会更容易得到它。
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
)
这将根据在两个表中找到的列值来更新表。
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
)