Je vais utiliser un exemple concret, mais hypothétique.
Chaque Commandez n'a normalement qu'un seul poste d'exécution :
Les commandes :
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 arrive parfois qu'une commande comporte deux postes :
LineItemID Order ID Quantity Description
========== ======== ======== =================================
{A58A1...} 6,784,329 5 pentametric fan
{0E9BC...} 6,784,329 5 differential girdlespring
Normalement lors de l'affichage des commandes à l'utilisateur :
SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description
FROM Orders
INNER JOIN LineItems
ON Orders.OrderID = LineItems.OrderID
Je veux afficher l'article unique de la commande. Mais avec cette commande occasionnelle contenant deux (ou plus) articles, les commandes seraient apparaître être dupliqué :
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 le serveur SQL choisissez-en juste un comme il le 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 suis aventureux, je pourrais montrer à l'utilisateur une ellipse pour indiquer qu'il y en a plus d'une :
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 rangs "en double
- ne se joint qu'à une seule des lignes, pour éviter les doublons.
Première tentative
Ma première tentative naïve a été de me joindre uniquement à la " TOP 1 Les postes de la ligne " :
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 "Ordres" n'a pas d'incidence sur les résultats.
correspondance avec un nom de table ou un nom d'alias
utilisé dans la requête.
Probablement parce que la sélection interne ne voit pas la table externe.
4 votes
Ne pouvez-vous pas utiliser
group by
?4 votes
Je pense (et corrigez-moi si je me trompe)
group by
nécessiterait de lister toutes les autres colonnes, à l'exception de celle où vous ne voulez pas de doublons. Source :