没有别名的“无连接谓词”

时间:2018-09-23 13:38:27

标签: sql sql-server tsql

我有两个桌子。 表A:

enter image description here

TableB:

enter image description here

我还有一个返回表值(1和3)的函数。

get_customer_id:

enter image description here

在运行不带别名的查询时,我得到所有满足内部联接谓词的条目:

SELECT ID FROM TableA AS A
    INNER JOIN TableB AS B ON B.IDb = A.ID
WHERE EXISTS (select ID from get_customer_id() AS GCI WHERE GCI.ID = ID)

以及查询计划中的消息“ No Join Predicate”。虽然我希望只看到ID为1和3的记录。

我知道可以通过两种方式解决问题。

1)

SELECT A.ID FROM TableA AS A
    INNER JOIN TableB AS B ON B.IDb = A.ID
WHERE EXISTS (select ID from get_customer_id() AS GCI WHERE GCI.ID = A.ID)

2)

SELECT ID FROM TableA AS A
    INNER JOIN TableB AS B ON B.IDb = A.ID
WHERE ID IN (select ID from get_customer_id())

但是我不明白为什么,如果我不指定别名,它不会返回我期望的结果,结果是条件不成立?为什么仅在查询方面看到警告,为什么这个问题不会出错? 对于任何答案和参考,我将不胜感激。我在互联网上找不到确切的解释...

1 个答案:

答案 0 :(得分:4)

您认为该子查询:

 WHERE EXISTS (select ID from get_customer_id() AS GCI WHERE GCI.ID = ID)

被解释为:

WHERE EXISTS (select ID from get_customer_id() AS GCI WHERE GCI.ID = A.ID)

那是一厢情愿的想法。 SQL中的范围界定规则以最接近的FROM开始。所以这真的解释为:

WHERE EXISTS (select ID from get_customer_id() AS GCI WHERE GCI.ID = GCI.ID)

因此,基本上没有“联合谓词”。

这就是为什么您应该始终限定列名的原因。顺便说一句,您不必选择ID,可以选择任何内容。我通常将其写为:

WHERE EXISTS (select 1 from get_customer_id() gci gci.ID = a.ID)