2011-04-21 3 views
1

J'ai 2 requêtes Informix qui, selon moi, devraient retourner les mêmes données mais ne le font pas. La première requête utilise une sous-requête en tant que filtre et ne retourne pas correctement les lignes. La seconde est effectuée à l'aide d'une jointure externe gauche vérifiant null sur la même colonne utilisée dans la sous-requête et renvoie correctement l'ensemble de données correct. Ai-je raté quelque chose ou est-ce un bug?2 requêtes qui devraient retourner les mêmes données mais pas

select i.invoice_date, oe.commit_no 
    from oe 
    join invoice i 
    on oe.invoice_no = i.invoice_no 
    where i.invoice_date > today - 60 
    and oe.commit_no not in (select commit_no from bolx) 

select i.invoice_date, oe.commit_no, bolx.bol_no 
    from oe 
    join invoice i 
    on oe.invoice_no = i.invoice_no 
    left join bolx 
    on bolx.commit_no = oe.commit_no 
    where i.invoice_date > today - 60 
    and bolx.commit_no is null 

schémas abrégée (un héritage db, donc il a quelques bizarreries):

invoice 
    invoice_no char(9), 
    invoice_date date 

oe 
    commit_no decimal(8, 0), 
    invoice_no char(9) 

bolx 
    commit_no decimal(8, 0) 

Répondre

3

Chaque fois que je lis "Not In ... ... sous-requête ne renvoie aucune ligne" Je Je suis assez sûr que je connais la réponse!

Je présume que select commit_no from bolx des rendements NULL valeurs?

La présence d'un NULL dans un NOT IN garantit qu'aucun résultat ne sera retourné.

foo NOT IN (bar, NULL) est équivalent à

foo <> bar and foo <> NULL

La partie foo <> NULL sera toujours évaluée à unknown et le AND ne peut jamais évaluer à true que si toutes les conditions sont évaluées à true.

+0

C'est le cas. Merci. J'ai changé mon application pour le second formulaire. –

+1

Ce comportement n'est pas particulier à Informix: il s'applique à n'importe quelle base de données SQL. –

Questions connexes