使用连接更新表 [重复]
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
【讨论】:
以上是关于使用连接更新表 [重复]的主要内容,如果未能解决你的问题,请参考以下文章