2012-09-21 5 views
1

Je suis encore aux prises avec des difficultés avec des requêtes simples JOIN. De ma dernière question, Simple but nested SELECT query, j'ai appris beaucoup de choses, mais ne pouvais toujours pas accomplir mes requêtes JOIN. :(Simple requête SQL JOIN

J'ai cette requête de la last question, et il travaille:

SELECT c.value, d.value 
FROM a 
LEFT JOIN b 
    ON a.id = b.idy 
LEFT JOIN c 
    ON b.idx = c.id 
LEFT JOIN d 
    ON b.idx = d.id 
WHERE a.name = "test" 

Maintenant, je veux ajouter une autre condition à la requête de regarder sur les tables e,f,g et si l'un des a.id, b.idx, c.id, d.idqui ne fonctionne pas existe sur les tables e,f,g, puis retourner les résultats. Par exemple, si c.id existe sur e.id alors il devrait élimine la ligne de la table c. Si a.id existe sur g.id, il ne devrait pas continuer parce que si vous avez pris hors a.id de la requête, les autres parties ne doivent rien retourner.

J'ai fait une structure de base de données exemple que vous pouvez voir le code sql ici: Sample.sql

Répondre

2

Vous voulez dire quelque chose comme ça?

SELECT c.value, d.value 
FROM a 
LEFT JOIN b 
    ON a.id = b.idy 
    AND b.id NOT IN (SELECT e.id FROM e UNION ALL SELECT f.id FROM f UNION ALL SELECT g.id FROM g) 
LEFT JOIN c 
    ON b.idx = c.id 
    AND c.id NOT IN (SELECT e.id FROM e UNION ALL SELECT f.id FROM f UNION ALL SELECT g.id FROM g) 
LEFT JOIN d 
    ON b.idx = d.id 
    AND d.id NOT IN (SELECT e.id FROM e UNION ALL SELECT f.id FROM f UNION ALL SELECT g.id FROM g) 
WHERE a.name = "test" 
AND a.id NOT IN (SELECT e.id FROM e UNION ALL SELECT f.id FROM f UNION ALL SELECT g.id FROM g) 
+0

oui, mais je dois tester ça! mes connaissances SQL sucent :( – Mahdi

+0

Hey, ça marche, mais quand j'ai par exemple 'c.id' dans 'f', alors il retourne les deux valeurs 'NULL' pour 'c.value, d.value'. Je veux qu'il retourne seulement 'NULL' pour 'c.value' ou au moins '0' lignes pas une paire de valeurs 'NULL' Est-ce possible? – Mahdi

+0

Cela fonctionne bien l'homme! Merci pour l'aide! :) – Mahdi

2

Pas sûr de votre dialecte SQL, mais avec MySQL, vous pouvez utiliser:

AND NOT EXISTS(SELECT 1 FROM e WHERE e.idx = b.idx) 
+0

merci! pourquoi choisir 1? je peux utiliser 'select null'? c'est le même? – Mahdi

+2

_exists_ vérifie la présence d'au moins une ligne, donc vous pouvez sélectionner n'importe quoi, null inclus – mauhiz

+0

aussi, veuillez utiliser la réponse de @lc qui est en fait plus précise que la mienne ^^; – mauhiz