PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Joindre des tables sur des colonnes de clé étrangère/primaire composite dans une requête

Il existe une NATURAL JOIN :

SELECT *
FROM   subscription
NATURAL JOIN delivery;

Citant le manuel sur SELECT :

Cela fonctionnerait pour votre configuration de test, mais il ne fait pas strictement ce que vous demandez . La connexion est basée sur toutes les colonnes partageant le même nom. Les clés étrangères ne sont pas prises en compte. Les cas où NATURAL JOIN est une bonne idée sont rares.

Simplifier le code / moins verbeux

Pour commencer, vous pouvez utiliser des alias de table et vous n'avez pas besoin de parenthèses autour des conditions de jointure avec ON (contrairement à USING ):

SELECT *
FROM   subscription s
JOIN   delivery     d ON d.magazine_id = s.magazine_id
                     AND d.user_id = s.user_id;

Étant donné que les noms de colonne dans les conditions de jointure sont identiques, vous pouvez encore simplifier avec USING :

SELECT *
FROM   subscription s
JOIN   delivery     d USING (magazine_id, user_id);

Il n'y a pas de variante de syntaxe qui crée automatiquement des jointures basées sur des contraintes de clé étrangère. Vous auriez à interroger les catalogues système et à créer dynamiquement le SQL.