1

我有两个在父子关系中相关的表

Sale
sale_id | customer_name

SaleItem
item_id | sale_id | item_type

每条销售记录都有一个或多个对应的销售项目记录。我的目标是创建一个销售列表,并将其对应的 SaleItems 显示为子项。我可以用这个查询来做到这一点:

SELECT s.sale_id, s.customer_name, si.item_id, si.item_type 
FROM Sale s, SaleItem si
WHERE s.sale_id=si.sale_id
ORDER BY s.sale_id, si.item_id

这会产生类似这样的结果(为了清楚问题,添加了空白行):

sale_id | customer_name | item_id | item_type
1       | Sam           | 1       | D
1       | Sam           | 2       | B
1       | Sam           | 3       | D

2       | Nate          | 4       | A
2       | Nate          | 5       | B

3       | Mike          | 6       | B
3       | Mike          | 7       | C

4       | Nate          | 8       | C
4       | Nate          | 9       | D

ORDER BY 子句会导致 Sales 与其已排序的 SaleItem 进行逻辑分组。这为我提供了编写一个漂亮的可折叠 UI 来表示数据所需的数据:

-Sale 1 - Sam
 -B 
 -B 
 -D 
+Sale 2 - Nate
+Sale 3 - Mike
-Sale 4 - Nate
 -C
 -D

这一切都很好,但是当我想按 item_type 对该列表进行排序时会发生什么?我想得到这样的结果集(为了清楚问题,添加了空白行):

sale_id | customer_name | item_id | item_type
2       | Nate          | 4       | A
2       | Nate          | 5       | B

3       | Mike          | 6       | B
3       | Mike          | 7       | C

4       | Nate          | 8       | C
4       | Nate          | 9       | D

1       | Sam           | 1       | D
1       | Sam           | 2       | B
1       | Sam           | 3       | D

请注意,每个销售及其对应的销售项目保持在一起。基本上我在这里需要做的是将每组 Sale+SaleItems 视为一个元素,并按任何列智能地对它们进行排序。因为我们本质上只是在这里对销售进行排序,并且 item_type 适用于 SaleItem,所以我们只需按第一个 SaleItem 的 item_type 进行排序,并保持销售中 SaleItems 的原始排序顺序。我真的希望这是有道理的。

我有一些问题:

  1. 我会以错误的方式解决这个问题吗?由于每个销售记录是一个或多个销售项目记录的“父”,因此 JOIN 似乎有点矫枉过正,因为我最终在每个“子”行中都重复了“父”数据。
  2. 如何按每个销售的第一个 item_type 对这些数据进行排序,并且仍然将每个销售的 SaleItems 保持在一起?

万分感谢。

4

1 回答 1

0

尝试这样的事情:

SELECT s.sale_id, 
       s.customer_name, 
       si.item_id, 
       si.item_type,
       min(si.item_type) OVER (PARTITION BY sale_id) as min_item_type
FROM Sale s, SaleItem si
WHERE s.sale_id=si.sale_id
ORDER BY min_item_type, s.sale_id, si.item_id

它将为您提供与您作为示例显示的结果接近的结果。

您可以min(si.item_type)用任何窗口函数(如 、、max... )替换以获得将“描述”每个组的 ,。firstlastitem_typesale_id

于 2013-11-12T19:54:02.393 回答