Я буду використовувати конкретний, але гіпотетичний приклад.
Кожне замовлення зазвичай має лише одну позицію :
Замовлення:
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
Але іноді буде замовлення з двома позиціями:
LineItemID Order ID Quantity Description
========== ======== ======== =================================
{A58A1...} 6,784,329 5 pentametric fan
{0E9BC...} 6,784,329 5 differential girdlespring
Зазвичай під час показу замовлень користувачеві:
SELECT Orders.OrderNumber, LineItems.Quantity, LineItems.Description
FROM Orders
INNER JOIN LineItems
ON Orders.OrderID = LineItems.OrderID
Я хочу показати один товар на замовлення. Але з цим випадковим замовленням, що містить два (або більше) пункту, замовлення, здавалося б, дублюються :
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
Мені дуже хочеться, щоб SQL Server просто обрав один , як це буде досить добре :
OrderNumber Quantity Description
=========== ======== ====================
STL-7442-1 7 prefabulated amulite
MPT-9931-8A 32 differential girdlespring
KSG-0619-81 5 panametric fan
Якщо я захоплююсь авантюрою, я можу показати користувачеві еліпсис, який вказує на наявність декількох:
OrderNumber Quantity Description
=========== ======== ====================
STL-7442-1 7 prefabulated amulite
MPT-9931-8A 32 differential girdlespring
KSG-0619-81 5 panametric fan, ...
Тож питання в тому, як це зробити
- усунути "дублюючі" рядки
- приєднуйтесь лише до одного з рядків, щоб уникнути дублювання
Перша спроба
Моя перша наївна спроба полягала лише в тому, щоб приєднатися до позицій рядка " ТОП 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
Але це дає помилку:
Стовпець або префікс "Замовлення" не
збігаються з назвою таблиці або псевдонімом,
використовуваним у запиті.
Імовірно, оскільки внутрішній вибір не бачить зовнішньої таблиці.
group by
зажадає перерахувати всі інші стовпці, виключаючи той, де ви не хочете копій. Джерело
group by
?