Maison > base de données > tutoriel mysql > Comment éliminer les numéros de commande en double lors de la jointure de tables avec plusieurs éléments de ligne ?

Comment éliminer les numéros de commande en double lors de la jointure de tables avec plusieurs éléments de ligne ?

Linda Hamilton
Libérer: 2025-01-17 06:21:09
original
157 Les gens l'ont consulté

How to Eliminate Duplicate Order Numbers When Joining Tables with Multiple Line Items?

Éviter les numéros de commande en double dans les jointures d'articles sur plusieurs lignes

Les jointures de bases de données impliquant des tables comportant plusieurs éléments de campagne par commande entraînent souvent des numéros de commande en double dans les résultats. Cet article explore des solutions efficaces pour récupérer un seul enregistrement par commande unique.

Approche initiale et ses lacunes

Une approche simple pourrait consister à sélectionner uniquement l'élément de campagne "TOP 1". Cependant, cela échoue en raison des limitations d'accès direct à la table externe à partir de l'instruction select interne.

Solution efficace : APPLIQUEMENT CROISÉ

L'opérateur CROSS APPLY apporte une solution élégante :

<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

CROSS APPLY récupère efficacement le premier élément de campagne de chaque commande, évitant ainsi les numéros de commande en double.

Alternative pour les anciennes versions de SQL Server : INNER JOIN

Pour les versions SQL Server antérieures à 2005, un INNER JOIN propose une solution comparable :

<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

Garantir des résultats déterministes

Essentiellement, TOP 1 sans clause ORDER BY n'est pas déterministe. L'élément de campagne sélectionné peut varier d'une exécution de requête à l'autre, même avec des données inchangées. Incluez toujours une clause ORDER BY dans la requête interne pour garantir des résultats cohérents.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal