2013-05-24 3 views
-1

Comment faire fonctionner un NOT IN avec une instruction JOIN? Voilà ma question ci-dessous:Utilisation de NOT IN avec JOIN Instruction

SELECT A.* 
FROM products A 
LEFT OUTER JOIN productmeta B ON A.id=B.product_id 
WHERE(B.group_id IS NULL OR B.group_id=0) 
AND (B.collection_id IS NULL OR B.collection_id=0) 
AND B.id NOT IN (SELECT collection_id FROM collections) 
+2

Cette requête semble syntaxiquement valide => cela signifie que cela fonctionne – zerkms

+0

S'il vous plaît expliquer dans les moindres détails ce qui ne se passe pas .. il peut y avoir une meilleure façon de le faire. – logixologist

+0

En quoi cela ne fonctionne-t-il pas pour vous? Il doit y avoir des exemples de données, une description de ce que vous essayez de faire et des exemples de sortie que vous voulez que la requête ne produise pas. La requête est correcte en ce qui concerne la syntaxe; il est difficile de dire pourquoi il ne produit pas les résultats que vous voulez sans savoir ce que vous voulez en tirer. –

Répondre

2

Je pense que le problème est la troisième clause. NULL va toujours provoquer l'échec. Mais c'est facile à tester:

SELECT A.* 
FROM products A LEFT OUTER JOIN 
    productmeta B 
    ON A.id=B.product_id 
WHERE (B.group_id IS NULL OR B.group_id=0) AND 
     (B.collection_id IS NULL OR B.collection_id=0) AND 
     (B.ID is NULL or B.id NOT IN (SELECT collection_id FROM collections)); 

Bien que je ne les ai pas changer, p serait un meilleur alias pour products et pm un meilleur alias pour productmeta.

+0

Merci @Gordon! C'était un peu boiteux, j'ai fait la vérification NULL sur les clauses précédentes. Ma faute! – gwinh