transact-sql如何知道我在此子查询中引用的是哪个表?

transact-sql如何知道我在此子查询中引用的是哪个表?,sql,sql-server,Sql,Sql Server,这是一个关于t-sql如何决定哪个列在子查询范围内的文档的问题。我试过谷歌ing,但它没有解释 下面是一个可运行的示例。update语句将a.a中的唯一条目设置为null。这大概是因为别名a的子查询引用解析为表b,表b中没有与值1匹配的行,因此外部更新查询返回null 是否有说明此设计选择的文件?否则它是不明确的,因为如果我将update语句更改为使用不同的别名,则a.a中的最终值为2: 参考文献也许能更好地解释它 这个想法很简单。表别名被解释为第一个表定义,从子查询的当前级别开始,然后向外移动

这是一个关于t-sql如何决定哪个列在子查询范围内的文档的问题。我试过谷歌ing,但它没有解释

下面是一个可运行的示例。update语句将a.a中的唯一条目设置为null。这大概是因为别名a的子查询引用解析为表b,表b中没有与值1匹配的行,因此外部更新查询返回null

是否有说明此设计选择的文件?否则它是不明确的,因为如果我将update语句更改为使用不同的别名,则a.a中的最终值为2:

参考文献也许能更好地解释它

这个想法很简单。表别名被解释为第一个表定义,从子查询的当前级别开始,然后向外移动。子查询中的表别名不能用于外部查询,因此引用只能向内移动

在您的示例中:

update a
set a = (select a from #b as a where a.a = 1)
from #a as a
a.a是指表a的a列。在子查询本身中,表a被定义为b。这是参考资料

在此查询中:

update aa
set a = (select a from #b as a where aa.a = 1)
from #a as aa;
表格别名为aa。子查询中未定义此项。它是在下一个级别定义的,因此它指的是a


通常,在查询中不要给不同的表提供相同的别名,子查询上的别名除外,这些子查询本质上只是特定表的筛选/选定版本。这只会导致混淆。

在第一个示例中,外部查询和内部查询之间没有关系,因此您正在为表a中的每一行的内部查询结果设置列“a”的值。内部查询返回null,因为b中没有值为1的行,所以a中的列a被设置为null

在第二个示例中,仍然没有提供内部查询和外部查询之间的关系。内部查询所做的就是从b中选择每个值,因为对于b中的每一行,a.a的值都是1。您可以从b中选择a作为内部查询

rhat a.a设置为2的原因是b表中只有1行,其值为2。如果b中有多行,那么我认为a.a将被设置为表b中最后一个返回行的值。因此,如果b中有两行,第一行的值为2,第二行的值为3,那么我希望a设置为3。否则它就不会执行


不管怎样,这些都不是很好的SQLIMHO

很好的解释很好的解释。它不会被选为可接受的答案,因为它没有回答有关文档请求的问题。感谢您找到合适的文档!
update a
set a = (select a from #b as a where a.a = 1)
from #a as a
update aa
set a = (select a from #b as a where aa.a = 1)
from #a as aa;