2016-05-16 8 views
0

Ich habe zwei Tabelle EMP & DEPT. Unten sind die Beschreibungen.Ungültige Unterabfrage, aber äußere Abfrage gibt die Datensätze zurück

**EMP table:** 

EMP_ID  NUMBER  
EMP_NAME  VARCHAR2(4) 

**DEPT table:** 

DEPT_ID  NUMBER  
DEPT_NAME  VARCHAR2(4) 

Wenn ich die folgende Abfrage ausführen, wurde es erfolgreich ausgeführt, obwohl die Unterabfrage ungültig ist.

SELECT * FROM EMP WHERE EMP_ID IN (SELECT SAL FROM DEPT); 

Ich erwarte ORA-00904: ungültige Kennung, aber es gibt die Datensätze aus EMP-Tabelle.

Antwort

0

Dies liegt daran, Oracle unterstützt korrelierte Unterabfragen auf einer Ebene. Der Umfang der Spalten in der äußeren Abfrage enthält also die Unterabfrage in Ihrem Beispiel.

Die Abfrage, die Sie geschrieben hat, ist äquivalent zu:

SELECT * 
FROM EMP 
WHERE EMP_ID IN (SELECT EMP.SAL 
        FROM DEPT); 

Es unterstreicht auch die Notwendigkeit, ausreichend Ihre Anfragen an Alias ​​- wenn Sie geschrieben hatte:

SELECT * 
FROM EMP 
WHERE EMP_ID IN (SELECT DEPT.SAL 
        FROM DEPT); 

dann würden Sie Sie den Fehler bekommen haben erwarteten.

+0

Vielen Dank für die Klarstellung. Ich habe versucht, mit Alias ​​und bekam einen Fehler. – hemalp108

0

Dies geschieht, wenn das Ergebnis der Unterabfrage nicht null ist.

In Ihrem Fall scheint es, dass seltsamerweise statt den Fehler berichten, dass die Spalte nicht existiert, wird das Ergebnis zurückgegeben, um nicht-null zu sein und dann die Top-Auswahl noch

erfolgt