Joignez-en un à plusieurs et récupérez le résultat unique
J'ai deux tables, dans PostgreSQL, si ce qui compte, avec un à de nombreuses relations. J'ai besoin de se joindre à eux, de sorte que pour chaque "un" je ne reçois que seul le résultat de la table "plusieurs". Non seulement cela, mais j'ai besoin de découvrir les résultats de la table "plusieurs".
TABLE_A ID | NOM | DATE | PLUS D'COLS.... 1 | JOHN | 2012-01-10 | .... 2 | LIZA | 2012-01-10 | .... 3 | ANNY | 2012-01-10 | .... 4 | JAMES | 2012-01-10 | .... ... TABLE_B ID | CODE1 | CODE2 | TRI 1 | 04020 | 85003 | 1 1 | 04030 | 85002 | 4 2 | 81000 | 80703 | 1 3 | 87010 | 80102 | 4 3 | 87010 | 84701 | 5 4 | 04810 | 85003 | 1 4 | 04030 | 85002 | 4 4 | 04020 | 85003 | 1 ... RÉSULTAT DE LA REQUÊTE ID | NOM | DATE | CODE1 | CODE2 1 | JEAN| 2012-01-10 | 04020 | 85003 2 | LIZA| 2012-01-10 | 81000 | 80703 3 | ANNY| 2012-01-10 | 87010 | 80102 4 | JAMES| 2012-01-10 | 04810 | 85003 ...
La colonne de TRI dans TABLE_B est en fait le dernier char dans CODE2 réorganisées. CODE2 pouvez en finir avec 1-9 mais 3 qui est le plus important alors 5, 7, 4, 2, 1, 0, 6, 8, 9 donc 3-->1, 5-->2, 7-->3 et ainsi de suite.
Le problème que je me pose, c'est que j'ai besoin de la ligne de TABLE_B où le tri est le plus petit nombre. Dans certains cas, il ya plusieurs plus bas de l'affaire (voir ID=4 dans TABLE_B), alors il n'est pas question que des lignes, avec le moins d'ID sont sélectionnés, mais seulement qu'il est l'unique raison pour que ID.
source d'informationauteur thorgilsv
Vous devez vous connecter pour publier un commentaire.
Plus simple, plus court, plus rapide avec PostgreSQL est
DISTINCT ON
:De détails, d'explications, de référence et des liens en cette étroitement liés répondre.
J'utilise un
LEFT JOIN
, de sorte que les lignes detable_a
sans aucune ligne correspondante danstable_b
ne sont pas abandonnées.Notes:
Tout en étant autorisés dans PostgreSQL, il est déconseillé de l'utiliser
date
comme nom de colonne. C'est un mot réservé dans chaque norme SQL et un nom de type, dans PsotgreSQL.C'est aussi un anti-modèle de nom d'une colonne d'ID
id
. Non descriptif et pas utile. L'un des (nombreux) convention de nommage serait de nom après la table où il est clé primaire:table_a_id
. Même nom pour les clés étrangères de référencement (si pas d'autres nom a priorité).PostgreSQL supporte fonction fenêtre. Essayez ceci,
SQLFiddle Démo
Voici ce que je ferais sur SQL Server.