【问题标题】:Sort query by field related to another field按与另一个字段相关的字段对查询进行排序
【发布时间】:2017-01-24 13:44:54
【问题描述】:

我的 SQL Server 数据库中有一个名为 dayorder 的表,其中包含以下字段:

dayorder_cod (autoinc id),
dayorder_number (order number),
dayorder_sequence (order sequence)
dayorder_parent (parent order, can be null).

例如,我可以有订单 100、200、998 和 999,其中 100 是 998 和 999 的父级。

我想对结果进行如下排序:100、998、999、200,即订单的子订单位于其父订单的下方。

【问题讨论】:

  • 请标记您正在使用的 DBMS

标签: sql sql-server sorting


【解决方案1】:

无需加入:

如果dayorder_parent 引用dayorder_number,则:

select d.*
from dayorder d
order by 
  isnull(d.dayorder_parent,d.dayorder_number)
  , d.dayorder_number

如果dayorder_parent 引用dayorder_cod,那么:

select d.*
from dayorder d
order by 
  isnull(d.dayorder_parent,d.dayorder_cod)
  , d.dayorder_cod

如果dayorder_sequence 对订单很重要

select d.*
from dayorder d
order by 
  isnull(d.dayorder_parent,d.dayorder_cod)
  , d.dayorder_sequence

工作原理:查询结果按dayorder_parent 排序,但每个订单的初始行对于dayorder_parent 的值为NULL

使用isnull(d.dayorder_parent,d.dayorder_number),我们可以说当订单没有父订单时,请改用其dayorder_number。 100 的孩子与 100 分组,每个组由他们的个人dayorder_number 进一步排序。

注意:您可以使用coalesce() 而不是isnull() 来获得相同的结果。我倾向于仅在需要从一组 3 个或更多值中获取第一个非空值时使用 coalesce(),因为 isnull() 仅支持两个参数。

【讨论】:

  • 就是这样!你能解释一下这是如何工作的吗?
  • 添加了解释,有帮助吗?
【解决方案2】:

试试这个:

SELECT t1.*
FROM dayorder AS t1
LEFT JOIN dayorder AS t2 ON t2.parent = t1.cod
ORDER BY COALESCE(t2.parent, t1.cod), t1.cod

编辑:

如果sequence 字段决定了表格中的顺序,那么您可以使用:

SELECT t1.*
FROM dayorder AS t1
LEFT JOIN dayorder AS t2 ON t2.parent = t1.cod
ORDER BY COALESCE(t2.sequence, t1.sequence), t1.sequence

【讨论】:

  • @aseolin 以什么方式?只需将cod 字段替换为确定表中顺序的字段即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 2016-04-14
  • 1970-01-01
  • 2015-12-21
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多