Sql 使用联接更新表

Sql 使用联接更新表,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我有两张桌子ta,tb。ta列-cId、c1、c2。c1和c2包含空值,需要用数据填充。tb柱-cId、c3、c4。c1和c2的数据将分别来自c3和c4 所以,我试着先做一个简单的内部连接。两个表的别名分别为al_ta和al_tb。然后,我放了一个update语句- 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 =

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

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

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。我该怎么做

示例表-

助教

结核病


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

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 
为什么在这里使用比原始表名更难写的别名呢?

请尝试一下

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

你能显示连接吗?为什么你把
ta
化名为
al_ta
-你只是想输入更多?@AaronBertrand-实际上,这只是一个例子。真正的代码有很长很难看的名字@是的,你的回答对我有用。非常感谢:)是的,这与我的意思类似,除了where子句,因为所有内容都已为空。但是,我认为最好加上where条款。现在添加代码和示例数据。@Trojan.ZBOT我不确定这些行中是否已经有数据。如果他们这样做了,那么这将阻止您再次更新这些行;如果他们不这样做,这个子句不会让你的更新变得更糟。是的,别名在这里没有任何意义。但是,在我的真实数据库中,它们确实如此。完全限定名非常大,必须使用别名。@Trojan.ZBOT Ok,所以在您的问题中,您说的是
UPDATE long\u table\u name SET alias1.col=alias2.col FROM dbo.long\u table\u name AS alias1 JOIN…
-您不能这样做。您需要说
UPDATE alias1 SET…
@AaronBertrand-这可以看作是排序查找吗?
FROM ta AS al_ta 
update ta set 
 ta.c1 = b.c3, 
  ta.c2 = b.c4
from ta a join tb b on a.cid = b.cid