我有两个桌子。 表A:
TableB:
我还有一个返回表值(1和3)的函数。
get_customer_id:
在运行不带别名的查询时,我得到所有满足内部联接谓词的条目:
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())
但是我不明白为什么,如果我不指定别名,它不会返回我期望的结果,结果是条件不成立?为什么仅在查询方面看到警告,为什么这个问题不会出错? 对于任何答案和参考,我将不胜感激。我在互联网上找不到确切的解释...
答案 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)