SQL Oracle IN运算符行为

Dav*_*vid 3 sql oracle

我使用Oracle而我无法解释这种行为:

SELECT DUMMY 
FROM   DUAL 
WHERE  DUMMY IN (SELECT DUMMY FROM z_sites);
Run Code Online (Sandbox Code Playgroud)

返回

DUMMY
-----
X
Run Code Online (Sandbox Code Playgroud)

还有这个 :

SELECT DUMMY FROM z_sites;
Run Code Online (Sandbox Code Playgroud)

返回

ORA-00904:"DUMMY":识别非valide 00904. 00000 - "%s:无效标识符"

所以在我的第一个查询中,子查询是假的,但查询仍然可以自行解决?

Luk*_*zda 6

这完全是关于范围:

SELECT DUMMY 
FROM   DUAL 
WHERE  DUMMY IN (SELECT DUMMY FROM z_sites);
Run Code Online (Sandbox Code Playgroud)

与:

SELECT DUMMY 
FROM   DUAL 
WHERE  DUMMY IN (SELECT DUAL.DUMMY FROM z_sites);
Run Code Online (Sandbox Code Playgroud)

鉴于:

SELECT DUMMY FROM z_sites;
-- there is no dummy column in z_sites table
Run Code Online (Sandbox Code Playgroud)

为了使事情更有趣,你可以检查如果z_sites包含虚拟列会发生什么:

CREATE TABLE z_sites(dummy VARCHAR2(100));
INSERT INTO z_sites(dummy) VALUES('Y');

SELECT DUMMY 
FROM   DUAL 
WHERE  DUMMY IN (SELECT DUMMY FROM z_sites);
-- 0 rows selected
<=>
SELECT DUMMY 
FROM   DUAL 
WHERE  DUMMY IN (SELECT z_sites.DUMMY FROM z_sites);
-- 0 rows selected

SELECT DUMMY 
FROM   DUAL 
WHERE  DUMMY IN (SELECT DUAL.DUMMY FROM z_sites);

DUMMY
-----
X
Run Code Online (Sandbox Code Playgroud)

DBFiddle演示

总结:始终在子查询中添加前缀以避免混淆.