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>
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>
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>
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!