2016-12-22 2 views
-2

J'ai fait une requête comme ceSELECT incorrect sous-requête « IN » état

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

Le problème était il n'y a pas de colonne « ID_NO » dans TABLE_B.So Je me attendais à cette requête ne fonctionne pas. Mais cette requête a fonctionné. Je ne comprends pas pourquoi.


Pourquoi cela n'a pas causé d'erreur?

+1

s'il vous plaît fournir la table stucture – Jens

+0

c'est un bon requête, si l'ID_NO de table_A avait un type différent de ID_NO à partir de table_B cela causerait un problème d'autres façons de fournir plus de détails. –

Répondre

5

La requête est correcte si table_B n'a pas de colonne nommée ID_NO, mais que table_A a. Ensuite, vous auriez une sous-requête corrélée, où la sous-requête select ID_NO fait référence à l'attribut ID_NO externe de table_A (cela n'a aucun sens, mais est correct pour le compilateur).

Tenir compte du schéma suivant:

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); 

Ensuite, la requête suivante compilera; mais il donnera toujours un résultat vide, parce que cela signifie en fait quelque chose comme où id_no pas (id_no):

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

Lorsque vous traitez avec des sous-requêtes, je vous suggère d'utiliser les alias de table afin d'éviter un tel comportement involontaire . Par exemple, la requête suivante ne compile pas, et le compilateur vous donne l'indice ce qui est faux:

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' 

Correction de l'erreur conduit alors à:

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

Bonne réponse. Quand je joins deux tables comme 'de TABLE_A, TABLE_B', j'ai toujours utilisé un alias pour éviter un comportement inattendu mais je ne l'avais jamais essayé sur une sous-requête. C'était mon erreur. Merci Stephan pour un bon commentaire – nick