Userò un esempio concreto, ma ipotetico.
Ogni ordine ha normalmente un solo elemento pubblicitario :
Ordini:
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
Ma a volte ci sarà un ordine con due elementi pubblicitari:
LineItemID Order ID Quantity Description
========== ======== ======== =================================
{A58A1...} 6,784,329 5 pentametric fan
{0E9BC...} 6,784,329 5 differential girdlespring
Normalmente quando si mostrano gli ordini all'utente:
SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description
FROM Orders
INNER JOIN LineItems
ON Orders.OrderID = LineItems.OrderID
Voglio mostrare il singolo articolo sull'ordine. Ma con questo ordine occasionale contenente due (o più) elementi, gli ordini sarebbero appaiono essere duplicato :
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
Quello che voglio davvero è avere SQL Server solo sceglierne uno , poiché sarà abbastanza buono :
OrderNumber Quantity Description
=========== ======== ====================
STL-7442-1 7 prefabulated amulite
MPT-9931-8A 32 differential girdlespring
KSG-0619-81 5 panametric fan
Se divento avventuroso, potrei mostrare all'utente un'ellissi per indicare che ce n'è più di uno:
OrderNumber Quantity Description
=========== ======== ====================
STL-7442-1 7 prefabulated amulite
MPT-9931-8A 32 differential girdlespring
KSG-0619-81 5 panametric fan, ...
Quindi la domanda è come
- eliminare le righe "duplicate"
- solo unirsi a una delle righe, per evitare la duplicazione
Primo tentativo
Il mio primo ingenuo tentativo è stato quello di unirmi solo agli elementi pubblicitari " 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
Ma questo dà l'errore:
La colonna o il prefisso "Ordini" non
corrispondono a un nome di tabella o alias
utilizzato nella query.
Presumibilmente perché la selezione interna non vede la tabella esterna.
group by
richiederei di elencare tutte le altre colonne, esclusa quella in cui non vuoi duplicati. Fonte
group by
?