Поведение оператора SQL Oracle IN - PullRequest
0 голосов
/ 08 июня 2018

Я использую Oracle и не могу объяснить это поведение:

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

Возвращает

DUMMY
-----
X

И это:

SELECT DUMMY FROM z_sites;

Возвращает

ORA-00904: "DUMMY": identificateur non valide 00904. 00000 - "% s: неверный идентификатор"

Так что в моем первом запросе подзапрос имеет значение false, нозапрос все еще оправдывает себя?!

1 Ответ

0 голосов
/ 08 июня 2018

Все дело в сфере:

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

такое же, как:

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

Принимая во внимание:

SELECT DUMMY FROM z_sites;
-- there is no dummy column in z_sites table

Чтобы сделать вещь более интереснойвы можете проверить, что произойдет, если 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

DBFiddle Demo

Подводя итог: всегда префикс вашегостолбцы в подзапросе, чтобы избежать путаницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...