Je vais utiliser un exemple concret, mais hypothétique.
Chaque commande ne comporte normalement qu'un seul élément de campagne :
Ordres:
OrderGUID OrderNumber
========= ============
{FFB2...} STL-7442-1
{3EC6...} MPT-9931-8A
LineItems:
LineItemGUID Order ID Quantity Description
============ ======== ======== =================================
{098FBE3...} 1 7 prefabulated amulite
{1609B09...} 2 32 spurving bearing
Mais il y aura parfois une commande avec deux éléments de campagne:
LineItemID Order ID Quantity Description
========== ======== ======== =================================
{A58A1...} 6,784,329 5 pentametric fan
{0E9BC...} 6,784,329 5 differential girdlespring
Normalement, lors de la présentation des commandes à l'utilisateur:
SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description
FROM Orders
INNER JOIN LineItems
ON Orders.OrderID = LineItems.OrderID
Je veux montrer l'article unique sur la commande. Mais avec cette commande occasionnelle contenant deux (ou plus) articles, les commandes semblent être dupliquées :
OrderNumber Quantity Description
=========== ======== ====================
STL-7442-1 7 prefabulated amulite
MPT-9931-8A 32 spurving bearing
KSG-0619-81 5 panametric fan
KSG-0619-81 5 differential girdlespring
Ce que je veux vraiment, c'est que SQL Server n'en choisisse qu'un , car ce sera suffisant :
OrderNumber Quantity Description
=========== ======== ====================
STL-7442-1 7 prefabulated amulite
MPT-9931-8A 32 differential girdlespring
KSG-0619-81 5 panametric fan
Si je deviens aventureux, je pourrais montrer à l'utilisateur des points de suspension pour indiquer qu'il y en a plus d'un:
OrderNumber Quantity Description
=========== ======== ====================
STL-7442-1 7 prefabulated amulite
MPT-9931-8A 32 differential girdlespring
KSG-0619-81 5 panametric fan, ...
La question est donc de savoir comment
- éliminer les lignes "en double"
- joindre uniquement à l'une des lignes, pour éviter la duplication
Premier essai
Ma première tentative naïve a été de ne rejoindre que les éléments de campagne " TOP 1 ":
SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description
FROM Orders
INNER JOIN (
SELECT TOP 1 LineItems.Quantity, LineItems.Description
FROM LineItems
WHERE LineItems.OrderID = Orders.OrderID) LineItems2
ON 1=1
Mais cela donne l'erreur:
La colonne ou le préfixe «Commandes» ne
correspond pas au nom de table ou au nom d'alias
utilisé dans la requête.
Vraisemblablement parce que la sélection interne ne voit pas la table externe.
group by
nécessiterait de répertorier toutes les autres colonnes, à l'exception de celle où vous ne voulez pas de doublons. Source
group by
?