2016-12-22 2 views
-2

habe ich eine Abfrage wie dieseFalsche SELECT Unterabfrage in ‚IN‘ Zustand

SELECT * 
FROM TABLE_A 
WHERE 1=1 
    AND ID_NO IN (
     SELECT ID_NO 
     FROM TABLE_B 
     WHERE SEQ = '1' 
    ) 

Das Problem war, gibt es keine Spalte ‚ID_NO‘ in TABLE_B.So ich diese Abfrage erwartete funktioniert nicht. Aber diese Abfrage funktionierte. Ich verstehe nicht warum.


Warum hat es keinen Fehler verursacht?

+1

geben Sie bitte die Tabelle stucture – Jens

+0

es ist ein richtiges Abfrage, wenn die ID_NO von Tabelle_A einen anderen Typ als ID_NO von Tabelle_B hatte, wird es ein Problem verursachen, andere Möglichkeiten bieten mehr Details. –

Antwort

5

Die Abfrage ist korrekt, wenn Tabelle_B keine Spalte ID_NO hat, aber Tabelle_A hat. Dann hätten Sie eine korrelierte Unterabfrage, wobei die Unterabfrage ID_NO sich auf das äußere ID_NO-Attribut von table_A bezieht (das macht zwar keinen Sinn, ist aber für den Compiler korrekt).

Betrachten Sie das folgende Schema:

create table table_a (
    id_no int 
); 

create table table_b (
    other_id_no int 
    ); 

insert into table_a values (1),(2); 
insert into table_b values (1),(3); 

Dann wird die folgende Abfrage kompilieren; aber es wird immer ein leeres Resultat ergeben, weil es bedeutet, tatsächlich so etwas wie, wo id_no nicht in (id_no):

select * from table_a where id_no not in (select id_no from table_b); 

Wenn mit Subqueries zu tun, würde ich vorschlagen Tabelle Aliase verwenden, um solche unbeabsichtigten Verhalten zu vermeiden . Zum Beispiel ist die folgende Abfrage nicht kompiliert, und der Compiler gibt Ihnen den Hinweis, was falsch ist:

select * from table_a a where a.id_no not in (select b.id_no from table_b b); 
Error: Unknown column 'b.id_no' in 'field list' 

die Fehler korrigieren führt dann zu:

select * from table_a a where a.id_no not in (select b.other_id_no from table_b b); 
+0

Große Antwort. Wenn ich zwei Tabellen wie "aus TABLE_A, TABLE_B" verknüpfe, habe ich immer Alias ​​verwendet, um unbeabsichtigtes Verhalten zu vermeiden, aber ich habe es nie bei der Unterabfrage versucht. Das war mein Fehler. Danke Stephan für einen guten Kommentar – nick

Verwandte Themen