account numbers
和card numbers
数据库。我将这些文件匹配到一个文件,以便将任何卡号匹配到该帐号,以便仅使用帐号。 我创建了一个视图,将表链接到帐户/卡数据库,以返回
update
和相关的帐号,现在我需要更新ID与帐号匹配的那些记录。这是
Table ID
表,其中的Sales_Import
字段需要更新:LeadID AccountNumber
147 5807811235
150 5807811326
185 7006100100007267039
这是
account number
表,我需要更新来自: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)
它更新了卡号转换为帐号,但帐号被替换为
RetrieveAccountNumber
#1 楼
我相信带有UPDATE FROM
的JOIN
会有所帮助: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;
#2 楼
将内容从一个表复制到另一个表的简单方法如下:UPDATE table2
SET table2.col1 = table1.col1,
table2.col2 = table1.col2,
...
FROM table1, table2
WHERE table1.memberid = table2.memberid
还可以添加条件以获取复制的特定数据。
评论
这可行,但是您不需要FROM UPDATE table2中的table2 SET table2.col1 = table1.col1,table2.col2 = table1.col2,... FROM FROM table1 WHERE table1.memberid = table2.memberid
– Sirentec
16-10-24在15:25
这没有用,但是UPDATE table2,table1 SET table2.col1 = table1.col1,... WHERE table1.memberid = table2.memberid(mysql和phpmyadmin)
–汤姆·库舍尔(Tom Kuschel)
17-2-2在12:56
#3 楼
对于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)在此处汇总了报告的名单。评论
前往MERGE。
–雅库布·贾努什斯基耶维奇
2012年6月28日6:16
我从不知道合并语法。它比“更新+加入”要干净得多。
–托尼·阿什沃思(Tony Ashworth)
2012年10月12日15:13
+1用于报告MERGE SQL Server的实现
–AFract
2013年12月6日上午9:37
使用MERGE的参数(包括上面链接的sqlblog.com中的帖子中的参数)可能令人信服,但根据MSDN,要考虑的一件事可能是:当两个表包含以下内容的复杂混合物时,... MERGE语句最有效匹配特征...仅根据另一个表的行来更新一个表时,可以使用基本的INSERT,UPDATE和DELETE语句来提高性能和可伸缩性
–托尼·普洛卡斯(Tony Pulokas)
16-10-27在16:20
@ jkp1187这个问题被标记为SQL Server。因此RE:FWIW-大约为零。
–马丁·史密斯
17年12月24日在11:29
#4 楼
未来开发人员的通用答案。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;
评论
值得注意的是,至少对于SQL Server,在顶部update子句中使用别名而不是表名(update t1 ...而不是update Table1 ...)
–戈登
17年4月25日在15:58
#5 楼
对于PostgreSQL:UPDATE Sales_Import SI
SET AccountNumber = RAN.AccountNumber
FROM RetrieveAccountNumber RAN
WHERE RAN.LeadID = SI.LeadID;
评论
我正在做的错误是:SET SI.AccountNumber = RAN.AccountNumber。仍然,我想知道为什么在postgresql中是错误的吗?谁能解释?
– Karan Arora
7月8日19:34
#6 楼
似乎您使用的是MSSQL,然后,如果我没有记错,它是这样完成的:UPDATE [Sales_Lead].[dbo].[Sales_Import] SET [AccountNumber] =
RetrieveAccountNumber.AccountNumber
FROM RetrieveAccountNumber
WHERE [Sales_Lead].[dbo].[Sales_Import].LeadID = RetrieveAccountNumber.LeadID
#7 楼
对于在foo.new
中没有匹配键的null
行,将foo
设置为bar
时,我遇到了同样的问题。我在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)
评论
为什么要求在哪里存在?
–乔治·舍利(GeorgSchölly)
2010年9月7日于15:31
因为foo中的每一行在bar中没有匹配项,最终都为null,因为select语句产生了null。希望这比我第一次尝试解释时更清楚。
– Kjell Andreassen
2011年1月7日17:43
在stackoverflow.com/questions/224732/…下面检查此答案
–巴希尔·阿尔·莫曼尼(Basheer AL-MOMANI)
18年7月9日在19:56
@KjellAndreassen您已经解决了我的问题。感谢您的代码。
– Bhavin Thummar
19年2月13日在11:51
#8 楼
以下是在SQL Server中对我有用的方法:UPDATE [AspNetUsers] SET
[AspNetUsers].[OrganizationId] = [UserProfile].[OrganizationId],
[AspNetUsers].[Name] = [UserProfile].[Name]
FROM [AspNetUsers], [UserProfile]
WHERE [AspNetUsers].[Id] = [UserProfile].[Id];
#9 楼
对于运行正常的MySql:UPDATE
Sales_Import SI,RetrieveAccountNumber RAN
SET
SI.AccountNumber = RAN.AccountNumber
WHERE
SI.LeadID = RAN.LeadID
#10 楼
感谢您的答复。我找到了解决办法。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)
评论
无论此处的代码是否有效,您都应该查看发布的其他两个解决方案。它们更加清晰,不易出错,几乎可以肯定更快。
–汤姆·H
08-10-22在20:40
只是关于此解决方案的说明,因此UPDATE ... FROM是专有的,如果由于使用SQL 2005或更早版本而无法使用MERGE语句,则这是一种与ANSI兼容的方法,用于对MSSQL中的表源执行更新。来源:sqlblog.com/blogs/hugo_kornelis/archive/2008/03/10/…
–伪编码器
2012-09-17 20:18
唯一适合我的解决方案,因为它具有标准的SQL更新语句(UPDATE SET WHERE),非常感谢
–巴希尔·阿尔·莫曼尼(Basheer AL-MOMANI)
18年7月9日在7:47
#11 楼
如果表位于不同的数据库中。 (MSSQL)update database1..Ciudad
set CiudadDistrito=c2.CiudadDistrito
FROM database1..Ciudad c1
inner join
database2..Ciudad c2 on c2.CiudadID=c1.CiudadID
#12 楼
使用以下查询块根据ID使用Table2更新Table1:UPDATE Sales_Import, RetrieveAccountNumber
SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber
where Sales_Import.LeadID = RetrieveAccountNumber.LeadID;
这是解决此问题的最简单方法。
#13 楼
MS SqlUPDATE 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 ;
#14 楼
在同一表中更新: 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
#15 楼
以下有人建议的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
的所有其他查询。因为OP将整个数据集与较小的子集进行比较,所以会出现NULL,那么当然会出现匹配问题。必须通过使用正确的JOIN
编写适当的SQL来解决此问题,而不是通过使用NOT IN
来躲避问题。在这种情况下,使用NOT IN
或NOT EXISTS
可能会遇到其他问题。我对最上面的一个投票,这是通过加入SQL Server来基于另一个表更新表的常规方式。就像我说的那样,除非先连接它们,否则不能在SQL Server的同一
UPDATE
语句中使用两个表。评论
我只能说在SQL Server 2017中可以很好地工作。只是给未来的人们一个提示。无需加入。
– SharpShade
18年11月14日在15:35
#16 楼
它适用于postgresqlUPDATE 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
);
#17 楼
我以为这是一个简单的示例,也许有人会更轻松, 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
#18 楼
Oracle 11gmerge into Sales_Import
using RetrieveAccountNumber
on (Sales_Import.LeadId = RetrieveAccountNumber.LeadId)
when matched then update set Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber;
#19 楼
在ID匹配的情况下从一张表更新到另一张表UPDATE
TABLE1 t1,
TABLE2 t2
SET
t1.column_name = t2.column_name
WHERE
t1.id = t2.id;
#20 楼
这将允许您基于在另一个表中找不到的列值来更新表。 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
)
#21 楼
试试这个: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
#22 楼
我想添加一件事。不要更新具有相同值的值,它会产生额外的日志记录和不必要的开销。
请参见下面的示例-尽管链接到3,它只会对2条记录执行更新。
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
#23 楼
如果以上答案对您不起作用,请尝试以下Update Sales_Import A left join RetrieveAccountNumber B on A.LeadID = B.LeadID
Set A.AccountNumber = B.AccountNumber
where A.LeadID = B.LeadID
评论
您可能要在UPDATE子句中使用表别名,否则,如果您在任何时候自行加入表,都会导致问题。
–汤姆·H
08-10-22在20:38
在set子句中,应将SI.AccountNumber更改为AccountNumber,否则将失败。
– AaronLS
10-4-27 '17:52
MS-Access对JOIN语句使用其他UPDATE。看看:sql-und-xml.de/sql-tutorial/…
–克里斯蒂安·阿默(Christian Ammer)
2010年7月22日在12:56
这对于mssql似乎很好,但在mysql中似乎不起作用。不过,这似乎可以完成此工作:UPDATE Sales_Import,RetrieveAccountNumber SET Sales_Import.AccountNumber = RetrieveAccountNumber.AccountNumber,其中Sales_Import.LeadID = RetrieveAccountNumber.LeadID;。稍微偏离主题,但可能会有所帮助
–爱德
2012年2月22日15:10
我认为不需要内部联接。以下Vonki解决方案有效:UPDATE [Sales_Lead]。[dbo]。[Sales_Import] SET [AccountNumber] = RetrieveAccountNumber.AccountNumber FROM RetrieveAccountNumber在[Sales_Lead]。[dbo]。[Sales_Import] .LeadID = RetrieveAccountNumber.LeadID
–古蒂
13年11月29日在16:08