我有一个结果表和两个源表。一个源与键具有相同的列名称作为结果表,第二个源具有略微不同(相同的值,只是不同的列名称)。 所以,如果我使用代码:
--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子句有效?
答案 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在这里更合适。