SQL: comment limiter une jointure sur la premier ligne?
Comment faire une jointure entre deux tables, mais en limitant à la première ligne qui répond à la condition de jointure ?
Dans cet exemple simple, je voudrais obtenir pour chaque ligne table_A la première ligne de table_B qui répond à la condition :
select table_A.id, table_A.name, table_B.city
from table_A join table_B
on table_A.id = table_B.id2
where ..
table_A (id, name)
1, John
2, Marc
table_B (id2, city)
1, New York
1, Toronto
2, Boston
The output would be:
1, John, New York
2, Marc, Boston
Peut être Oracle fournit une fonction de ce genre (la performance est un sujet de préoccupation).
sélectionnez * à partir de table_A join (select * feom table_B groupe par id2) b sur table_A.id = b.id2 où ..
Rejoindre une subqery avec la fonction row_number et dans la condition de jointure ajouter et numero_ligne=1
Fournir un exemple de résultat attendu de données(table factice de données) va nous aider dans la compréhension de vos besoins.
Rejoindre une subqery avec la fonction row_number et dans la condition de jointure ajouter et numero_ligne=1
Fournir un exemple de résultat attendu de données(table factice de données) va nous aider dans la compréhension de vos besoins.
OriginalL'auteur kkung | 2016-02-07
Vous devez vous connecter pour publier un commentaire.
Le mot clé ici est PREMIÈRE. Vous pouvez utiliser l'analytique de la fonction
FIRST_VALUE
ou un agrégat de construireFIRST
.Pour
FIRST
ouLAST
la performance n'est jamais pire et souvent mieux que l'équivalentFIRST_VALUE
ouLAST_VALUE
construire parce que nous n'avons pas superflu fenêtre de tri et, en conséquence, une baisse du coût d'exécution:Depuis 12c introduit l'opérateur
LATERAL
, ainsi queCROSS/OUTER APPLY
rejoint, il est possible d'utiliser une sous-requête corrélée à la droite de l'JOIN
clause:OriginalL'auteur 0xdb
Si vous voulez juste valeur unique d'une sous-requête scalaire peut être utilisé:
OriginalL'auteur Husqvik
OriginalL'auteur Mihai
Sur Oracle12c, il y a enfin le nouveau croix/externe appliquer l'opérateur qui permettra à ce que vous avez demandé, sans aucune solution de contournement.
l'exemple suivant est un exemple qui ressemble sur dictionnaire de vues pour juste un de la (probablement)de nombreux objets appartenant à ces utilisateurs d'avoir leur nom commençant par 'SYS':
Sur Oracle 11g et les versions antérieures, vous devez utiliser uniquement des solutions de contournement que, généralement, l'analyse complète de la seconde table en fonction de l'Id de la deuxième table pour obtenir les mêmes résultats, mais pour les tests de besoin vous pouvez activer la latérale de l'opérateur (également disponible sur 12c sans nécessité de permettre à de nouveaux trucs) et l'utilisation de ce
OriginalL'auteur Alessandro Rossi
Requête:
Sorties:
OriginalL'auteur MT0