我有这样的查询
SELECT *
FROM my_table
WHERE ... AND id IN (SELECT t2.id
FROM my_table t2
WHERE id = t2.id AND ... );
我知道在这个例子中我可以结合这两个WHERE
子句并且不使用子查询,但这不是重点。
该查询在我正在使用的 DBMS(SQL Anywhere 16)上完美运行,但我想知道id
子查询中my_table.id
从主查询引用的事实是否是标准行为,或者我只是幸运。
链接或参考 RFC 或任何官方文档表示赞赏:)
不,这是错误的。标准行为是在
WHERE id = ...
子查询中id
引用范围内最近的表。那就是t2
。my_table
只有t2
在没有id
列的情况下才会在外部查询中引用。不过你很幸运,因为
WHERE id = t2.id
- 被翻译为WHERE t2.id = t2.id
实际上并不需要,因为你使用了WHERE id IN (subquery)
. 如果你有一个EXISTS
版本,它不会像你预期的那样工作。因此,编写查询的正确方法是为所有列引用添加前缀:
或者非常小心,仅在需要时添加前缀:
我仍然更喜欢
EXISTS
此类查询的版本:或(如果您总是非常小心):