【发布时间】:2011-01-03 20:03:49
【问题描述】:
我将使用一个具体但假设的例子。
每个订单通常只有一个订单项:
订单:
OrderGUID OrderNumber
========= ============
{FFB2...} STL-7442-1
{3EC6...} MPT-9931-8A
订单项:
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, ...
所以问题是如何选择
- 消除“重复”行
- 只加入其中一行,以避免重复
第一次尝试
我第一次天真的尝试是只加入“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
但这给出了错误:
“订单”列或前缀没有
与表名或别名匹配
在查询中使用。
大概是因为inner select没有看到outer table。
【问题讨论】:
-
你不能用
group by吗? -
我认为(如果我错了,请纠正我)
group by需要列出所有其他列,不包括您不想重复的列。 Source
标签: sql sql-server tsql sql-server-2000