带SORT的SQL SELECT父子级(...再次)

时间:2018-11-26 11:11:32

标签: tsql sql-order-by parent-child coalesce

更新: 我有一个简单的一级父子关系表,其中包含以下列:

ID_Asset| Parent_ID_Asset | ProductTitle

我需要按“父级”分组的输出,然后是“子级”,还要按“父级和子级名称”排序。我在小提琴中的尝试。

有关详情,请参见此处:https://rextester.com/PPCHG20007

所需订单:

9   8   NULL  ADONIS Server
7   16  8     ADONIS Designer
8   20  8     ADONIS Portal Module “Control & Release” Package XS

首先是父母,而不是孩子,而ProductTitle按字母顺序排列。

感谢所有提示。

3 个答案:

答案 0 :(得分:0)

我将改为条件排序:

select t.*
from table t
order by (case when parent_id is null then id else parent_id end), ProductTitle;

我假设您需要根据父子关系对数据进行排序。

答案 1 :(得分:0)

据我了解,您需要对根产品的名称进行排序,并在它们之间显示按名称排序的子产品,并在其之间显示其子产品等。 / p>

我猜您正在使用递归CTE。您可以定义一个“层次结构排序”帮助程序,该帮助程序是当前级别中的填充数字,对于每个深层次,请在当前级别中添加一个带有填充数字的后缀,等等。

类似的东西:

isActionAvailable()

答案 2 :(得分:0)

我认为这是您要寻找的订单。这会将每一行连接到其父行(如果存在)。然后,如果有TP(父)记录,则该记录就是父标题,ID等,否则当前记录必须是父记录。为了清楚起见,我在查询结果中显示了父名称。然后按

排序
  • 父母的名字(所以父母和孩子在一起,但按照父母的名字顺序)
  • 父母ID(如果两个或两个以上父母具有相同的姓名/称谓,这将使孩子拥有正确的父母)
  • 一个标志,该标志对于父母来说是0,对于孩子来说是1,因此父母优先。
  • 当前记录名称,它将按名称/标题顺序对子级进行排序

代码为

Select T.*, 
    isnull(TP.ProductTitle, T.ProductTitle) as ParentName  -- This is the parent name, shown for reference
from test T
    left outer join Test TP on TP.ID_Asset = T.Parent_ID_Asset  --This is the parent record, if it exists
ORDER BY isnull(TP.ProductTitle, T.ProductTitle),  --ParentName sort
    isnull(TP.ID_Asset, T.ID_Asset),  --if two parents have the same title, this makes sure they group with their correct children
    Case when T.Parent_ID_Asset is null then 0 else 1 end,  --this makes sure the parent comes before the child
    T.ProductTitle  --Child Sort