Maison > base de données > tutoriel mysql > Comment joindre efficacement la première ligne d'une table associée en SQL ?

Comment joindre efficacement la première ligne d'une table associée en SQL ?

DDD
Libérer: 2025-01-17 06:18:09
original
593 Les gens l'ont consulté

How to Efficiently Join to the First Row of a Related Table in SQL?

Sélection uniquement de la première ligne d'une table associée en SQL

De nombreux ensembles de données contiennent des lignes avec plusieurs entrées provenant de tables associées. Joindre efficacement ces tables nécessite une stratégie pour éviter la duplication des données. Cet article montre comment joindre uniquement la première ligne d'une table associée pour chaque entrée de la table principale.

Le défi : éviter les jointures en double

Une simple jointure peut produire plusieurs lignes pour chaque commande si la table associée comporte plusieurs entrées pour un seul ID de commande. Nous avons besoin d'une méthode pour sélectionner uniquement la première ligne pertinente.

Approche inefficace : le TOP 1 piège

Une tentative naïve d'utilisation de TOP 1 dans une sélection interne échoue car la requête interne ne peut pas accéder aux colonnes de la table externe (comme OrderID).

Solutions efficaces : deux méthodes éprouvées

Deux méthodes fiables permettent d'obtenir le résultat souhaité :

1. CROSS APPLY (SQL Server 2005 et versions ultérieures) :

Cette approche utilise CROSS APPLY pour corréler efficacement les requêtes externes et internes :

<code class="language-sql">SELECT Orders.OrderNumber, LineItems2.Quantity, LineItems2.Description
FROM Orders
CROSS APPLY
(
    SELECT TOP 1 LineItems.Quantity, LineItems.Description
    FROM LineItems
    WHERE LineItems.OrderID = Orders.OrderID
) LineItems2</code>
Copier après la connexion

2. INNER JOIN (Pour les versions SQL Server antérieures à 2005) :

Pour les anciennes versions de SQL Server, un INNER JOIN avec une sous-requête permet d'obtenir le même résultat :

<code class="language-sql">SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description
FROM Orders
JOIN LineItems
ON LineItems.LineItemGUID =
(
    SELECT TOP 1 LineItemGUID
    FROM LineItems
    WHERE OrderID = Orders.OrderID
)</code>
Copier après la connexion

Les deux méthodes utilisent TOP 1 pour sélectionner uniquement la première ligne correspondante de LineItems. Cela élimine la redondance des données.

Garantir des résultats déterministes

Surtout, sans clause ORDER BY dans l'instruction SELECT interne, la "première" ligne est arbitraire. Différentes exécutions de requêtes peuvent renvoyer des résultats différents, même avec des données identiques. Incluez toujours une clause ORDER BY dans la requête interne pour garantir des résultats cohérents et prévisibles. Par exemple :

<code class="language-sql">SELECT TOP 1 LineItems.Quantity, LineItems.Description
FROM LineItems
WHERE LineItems.OrderID = Orders.OrderID
ORDER BY LineItems.SomeColumn  -- Add a column to order by</code>
Copier après la connexion

Un exemple SQLfiddle illustrant ces techniques est disponible (lien omis, car il n'est pas possible de créer un lien SQLfiddle en direct ici). Reportez-vous aux ressources en ligne pour des exemples pratiques.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal