2010-01-28 4 views
0

Mon code génère une requête volumineuse. Une version simple estEst-il possible de JOIN avec un var depuis un LEFT JOIN sans détruire les lignes?

SELECT * FROM main_table as mt 
JOIN user_data AS ud ON mt.user_id=ud.id 
LEFT JOIN ban_Status AS bs ON ud.status_id=bs.id 
JOIN AnotherTable ON bs.data=AnotherTable.id 

REMARQUE: Ce code n'a pas été testé. Lorsque je supprime la dernière jointure, j'obtiens des résultats.

Je peux aussi le changer en jointure gauche mais ce serait faux. Si ud.status n'est pas nul je voudrais une jointure comme je le fais toujours quand je fais une requête select de ban_Status. Comment puis-je réparer ça? dois-je écrire joindre gauche sur chaque table si je suis parti rejoindre la table parent? cela ne me donnerait-il pas des effets secondaires?

J'utilise ATM sqlite mais passe à Tsql

Répondre

3

Utilisez le LEFT JOIN, mais dans votre clause WHERE préciser que ce soit à la fois ud.status_id est nulle et AnotherTable.id est nul ou n'est nulle.

SELECT * FROM main_table as mt 
JOIN user_data AS ud ON mt.user_id=ud.id 
LEFT JOIN ban_Status AS bs ON ud.status_id=bs.id 
LEFT JOIN AnotherTable ON bs.data=AnotherTable.id 
WHERE (ud.status_id is null and AnotherTable.id is null) 
     or (ui.status_id is not null and AnotherTable.id is not null) 

Cela vous empêchera de sélectionner les dossiers qui ont un ban_Status mais ne disposent pas des données supplémentaires de l'autre table.

+0

+1. Cela semble fonctionner mais pourriez-vous également expliquer pourquoi un INNER JOIN dans une chaîne de LEFT JOINs semble faire que tous ces JOINS GAUCHE se comportent comme une INNER JOIN? –

+0

Si 'LEFT JOIN' ne peut pas joindre une ligne, alors il retournera' NULL' dans tous ses champs. Ensuite, si vous utilisez un 'INNER JOIN' sur un identifiant' NULL', la ligne entière sera rejetée (en raison de la règle 'INNER JOIN'). –

+0

@Alex - simple, merci. –