更新中的不明确的列名称where语句

时间:2015-12-17 15:14:33

标签: sql-server-2008 tsql sql-update

我有一个结果表和两个源表。一个源与键具有相同的列名称作为结果表,第二个源具有略微不同(相同的值,只是不同的列名称)。 所以,如果我使用代码:

--Works
Update new_table set new_column_1 = source_column_1
from new_table t0
Left join source_table_1 t1 
    On t0.key_column = t1.id_column
Where key_column = t0.key_column

--Don't
Update new_table set new_column_2 = source_column_2
from new_table t0
Left join source_table_2 t1 
    On t0.key_column = t1.key_column
Where key_column = t0.key_column

第二个例子会给我"不明确的列名" Where语句中的错误。 (第一个key_column应该属于更新目标,第二个key更新源)

我通过将更新源包装到子查询中来解决这个问题,子查询会将键列重命名为其他内容,但我很好奇为什么会发生这种情况。为什么join的键名对where子句有效?

1 个答案:

答案 0 :(得分:2)

您必须使用别名,因为两个表都有一个名为key_column的列。

此查询应该有效:

Update t0 set new_column_2 = t1.source_column_2 -- or t0.source_column_2?
from new_table t0
Left join source_table_2 t1 
    On t0.key_column = t1.key_column
Where t1.key_column = t0.key_column

别名将替换update和set之间的表名。

但是where子句似乎没有必要。它与ON子句相同。 INNER JOIN在这里更合适。