2017-10-05 18 views
1

Est-il possible d'avoir deux jointures dans une seule requête, où la deuxième jointure est une connexion entre table_2 et table_3 (aucune référence de clé dans Tableau 1)?Postgresql plusieurs jointures dans une requête unique où la clé étrangère d'une jointure n'existe pas dans toutes les tables

table_1 

id | column_a 



table_2 

id | table_1_id | table_3_id | column_b 



table_3 

id | column_c 

requête existante:

SELECT * FROM table_1 RIGHT OUTER JOIN table_2 WHERE table_1.id id = ? and WHERE column_a = ? 

me donne l'information que je veux de table_1 et table_2, mais l'info table_2 aura juste la colonne table_3_id.

Dans la même requête, je voudrais rejoindre table_3 pour obtenir ses données basées sur table_2.table_3_id

Répondre

1

En un mot - oui. Vous pouvez simplement ajouter plus join clauses:

SELECT   * 
FROM    table_1 
RIGHT OUTER JOIN table_2 ON table_1.table_2_id = table_2.id 
RIGHT OUTER JOIN table_3 ON table_3.table_3_id = table_3.id 
WHERE   table_1.id = ? AND column_a = ? 
+1

merci! J'ai essayé cela au début, mais j'ai eu une faute de frappe pour l'un de mes noms de table et j'ai pensé que cela n'aurait pas été possible – Jon

1

Vous where clause tourne la right outer join dans un inner join. Je ne suis pas fan des bonnes jointures en général. Je pense que la sémantique d'une jointure à gauche est plus simple.

Donc, vous devriez écrire cela comme:

SELECT . . . 
FROM table_1 t1 JOIN 
    table_2 t2 
    ON t2.table1.id = t1.id JOIN 
    table_3 t3 
    ON t2.table3.id = t3.id 
WHERE t1.id = ? AND column_a = ?; 

Notes:

  • Vous ne devriez pas utiliser outer join puis les annuler dans la clause where.
  • Vous devez répertorier les colonnes que vous souhaitez explicitement.
  • Vous devez qualifier toutes les références de colonne dans une requête multi-table.
  • Les alias de table facilitent l'écriture et la lecture de la requête.
+0

merci pour les informations supplémentaires! changera – Jon