Sql server 2008 更新'中的列名称不明确;where语句
我有一个结果表和两个源表。一个源的键的列名和结果表的列名相同,而第二个源的列名略有不同(相同的值,只是列名不同)。 因此,如果我将代码用作:Sql server 2008 更新'中的列名称不明确;where语句,sql-server-2008,tsql,sql-update,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 --
--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语句中给出了“不明确的列名”错误。(第一个键列应属于更新目标,第二个键列应属于更新源)
我通过将更新的源代码包装到子查询中来解决这个问题,子查询会将键列重命名为其他内容,但我很好奇为什么会发生这种情况。为什么join的键名对where子句有效 必须使用别名,因为两个表都有一个名为key\u 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子句相同。在这里,内部联接更合适。为什么不使用别名t1?这可能是因为源表1没有键列,但表2有键列。在Q2中,如果不使用别名,就无法知道第一个key_列是属于t0还是t1。我不确定是否可以为作为更新目标的表分配allias,并尝试在new_table.key_column=t0.key_column给我“无法绑定多部分标识符”的地方执行此操作