Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 更新'中的列名称不明确;where语句_Sql Server 2008_Tsql_Sql Update - Fatal编程技术网

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给我“无法绑定多部分标识符”的地方执行此操作