Maison >base de données >tutoriel mysql >Comment sélectionner efficacement uniquement le premier élément de campagne pour chaque commande lors de la jonction des tables de base de données ?

Comment sélectionner efficacement uniquement le premier élément de campagne pour chaque commande lors de la jonction des tables de base de données ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-17 06:13:09174parcourir

How to Efficiently Select Only the First Line Item for Each Order When Joining Database Tables?

Jointures de tables de base de données : sélection uniquement du premier élément de ligne par commande

Dans les opérations de base de données, un défi courant survient lors de la jointure de tables telles que Orders et LineItems, où une commande peut avoir plusieurs éléments de campagne associés. Cela entraîne souvent des données redondantes dans l’ensemble de résultats joint. L'objectif est de récupérer efficacement un seul élément de campagne par commande.

Une approche naïve pourrait impliquer l'utilisation de TOP 1, mais cela peut conduire à des erreurs sans référencement approprié des tables dans les sous-requêtes.

Solutions efficaces : CROSS APPLY et JOIN avec ORDER BY

Deux méthodes robustes répondent efficacement à ce problème :

Méthode 1 : Utilisation de CROSS APPLY

Cette approche utilise CROSS APPLY pour joindre la table Orders avec une sous-requête qui sélectionne l'élément de ligne supérieur pour chaque commande :

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

Méthode 2 : Utiliser JOIN avec ORDER BY

Cette méthode utilise une clause JOIN, dans laquelle la condition de jointure sélectionne le LineItemGUID dans une sous-requête qui classe les éléments de campagne et sélectionne celui du premier pour chaque commande :

<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
    ORDER BY LineItemGUID
);</code>

Les deux méthodes garantissent qu'un seul élément de campagne est renvoyé pour chaque commande. Surtout, l’inclusion d’une clause ORDER BY dans la sous-requête est essentielle pour des résultats déterministes. Omettre ORDER BY avec TOP 1 conduit à des résultats imprévisibles, car le « premier » élément de ligne peut varier selon les exécutions de requêtes. L'utilisation de ORDER BY garantit une sélection cohérente d'un élément de campagne spécifique en fonction des critères de tri choisis.

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!

Déclaration:
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