我使用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:无效标识符"
所以在我的第一个查询中,子查询是假的,但查询仍然可以自行解决?
这完全是关于范围:
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)
总结:始终在子查询中添加前缀以避免混淆.
| 归档时间: |
|
| 查看次数: |
62 次 |
| 最近记录: |