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