使用连接更新表 [重复]

Posted

技术标签:

【中文标题】使用连接更新表 [重复]【英文标题】:Update a table by using a join [duplicate] 【发布时间】:2013-12-11 00:07:19 【问题描述】:

我有两张桌子,待定。 ta 列 - cId、c1、c2。 c1 和 c2 包含空值,需要用数据填充。 tb 列 - cId、c3、c4。 c1 和 c2 的数据将分别来自 c3 和 c4。

所以,我先尝试做一个简单的内部连接。两个表的别名分别为 al_ta 和 al_tb。然后,我放了一条更新语句 -

UPDATE ta SET 
  al_ta.c1 = al_tb.c3, 
  al_ta.c2 = al_tb.c4
FROM ta AS al_ta
INNER JOIN tb AS al_tb 
ON al_tb.cId = al_tb.cId

这不起作用,我收到一个错误 - 无法绑定多部分标识符 al_ta.c1。我该如何完成这项工作?

示例表 -

ta

cId c1  c2
1   NULL    NULL
2   NULL    NULL
3   NULL    NULL

待发

cId c3  c4
1   11  111
2   22  222
3   33  333
4   44  444

【问题讨论】:

你能显示连接吗?? 你为什么将ta 别名为al_ta - 你只是想输入更多? @AaronBertrand - 实际上,这只是一个例子。真正的代码有很长很丑的名字。 :) @AaronBertrand - 是的,你的回答对我有用。非常感谢:) 【参考方案1】:

引用列时,如果您已在 JOIN 中抽象出表名,则需要使用别名,而不是基表名。猜测您的连接可能是什么样子,您可能打算这样写:

UPDATE ta SET 
  ta.c1 = tb.c3, 
  ta.c2 = tb.c4
FROM dbo.some_long_table_name_a AS ta
INNER JOIN dbo.some_long_table_name_b AS tb 
ON ta.cId = tb.cId
WHERE ta.c1 IS NULL OR ta.c2 IS NULL;

我不明白这样说的目的:

FROM ta AS al_ta 

您为什么要在此处使用实际上比原始表名更难编写的别名?

【讨论】:

是的,这与我的意思类似,不包括 where 子句,因为一切都已经为空。但是,我认为最好添加 where 子句。现在添加代码和示例数据。 @***.ZBOT 我不确定是否有任何行已经在这些列中有数据。如果他们这样做了,那么这将阻止您再次更新这些行;如果他们不这样做,则此条款不会使您的更新变得更糟。 是的,别名在这里没有任何意义。但是,在我的真实数据库中,他们确实如此。完全限定名称很大,必须使用别名。 @***.ZBOT 好的,所以在你的问题中你说的是UPDATE long_table_name SET alias1.col = alias2.col FROM dbo.long_table_name AS alias1 JOIN ... - 你不能那样做。你需要说UPDATE alias1 SET ... @AaronBertrand - 这可以被视为某种查找吗?【参考方案2】:

请试一试

update ta set 
 ta.c1 = b.c3, 
  ta.c2 = b.c4
from ta a join tb b on a.cid = b.cid

【讨论】:

以上是关于使用连接更新表 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

MS Access:使用多个连接更新语句 [重复]

带连接的 SQL 表更新 [重复]

使用多个表的 SQL Server 更新 [重复]

MySQL更新连接查询以解决重复值

从内部连接更新列[重复]

连接两个表的工作查询是完美的,除了我无法摆脱重复项