Question REJOIGNEZ trois tables


J'essaie de récupérer deux ensembles d'informations (les parties rouges et bleues du diagramme dans la même requête).

Je pensais que je pouvais le faire en utilisant le sql comme indiqué ci-dessous, mais cela ne me renvoie rien quand TableC ne possède pas d’enregistrement. Si TableC n'a pas d'enregistrements, je voudrais quand même que cette requête me renvoie les résultats indiqués par la zone BLEUE.

SELECT A. * FROM TableA A

JOIN TableB B ON (A.id = B.a_id)

JOIN TableC C ON (A.id = C.a_id)

Appréciez les pointeurs pour me rendre les segments rouges et / ou bleus. Merci d'avance =]


15
2017-07-12 08:36


origine


Réponses:


essayer quelque chose comme ça

SELECT A.* FROM TableA A
LEFT OUTER JOIN TableB B ON (A.id = B.a_id)
LEFT OUTER JOIN TableC C ON (A.id = C.a_id)
WHERE B.a_id IS NOT NULL 
  OR c.a_id IS NOT NULL

17
2017-07-12 08:41



Pour comprendre pourquoi vous n'obtenez aucun résultat lorsque TableC n'a pas d'enregistrements, vous devez apprendre un peu sur les types JOIN en SQL.

Fondamentalement, lorsque vous émettez la requête

TableA A JOIN TableB B ON A.id = B.a_id

vous dites à la base de données de regarder les deux TableA et TableB et récupère toutes les paires de lignes qui satisfont le prédicat de jointure (A.id = B.a_id). Par conséquent, si TableB est vide, la base de données ne peut pas trouver et paire de lignes avec les critères précités.

Ce type de JOIN est appelé JOINTURE INTERNE et c'est le type d'opération de jointure le plus courant utilisé.

Dans votre cas, vous voulez aller chercher tout des lignes de TableA X TableB et tout pertinent des lignes de TableC, si de telles lignes existent (en fonction de la prédiction de jointure "A.id = C.a_id". C'est le cas pour une EXTERIEUR. Les deux types les plus communs d'une telle jointure sont LEFT JOIN (qui inclut toutes les lignes de la table de gauche) et RIGHT JOIN (qui inclut toutes les lignes de la table de droite).

Dans ce cas, votre requête doit être:

SELECT A.*
FROM
  (TableA A JOIN Table B B ON A.id = B.a_id)
  LEFT JOIN TableC C ON A.id = C.a_ID

Je suggère de jeter un oeil à la Wikipedia pertinent page, si vous souhaitez en savoir plus sur les types de jointure en SQL

modifier

En suivant la même logique, si vous voulez avoir toutes les lignes de TableA et uniquement les lignes pertinentes des tables TableB et TableC (s'ils existent), votre requête deviendrait:

SELECT A.*
FROM
  (TableA A LEFT JOIN Table B B ON A.id = B.a_id)
  LEFT JOIN TableC C ON A.id = C.a_ID

9
2017-07-12 08:56