SQL排序依据,父级,子级和排序顺序

时间:2014-07-06 19:18:51

标签: sql sql-server sql-server-2008

我有以下查询:

SELECT
 p.CategoryID
,p.Category_Name
,p.IsParent
,p.ParentID
,p.Sort_Order
,p.Active
,p.CategoryID AS sequence

FROM tbl_Category p
WHERE p.IsParent = 1

    UNION

 SELECT
  c.CategoryID
 ,' - ' + c.Category_Name AS Category_Name
 ,c.IsParent
 ,c.ParentID
 ,c.Sort_Order
 ,c.Active
 ,c.ParentID as sequence
   FROM tbl_Category c
   WHERE c.IsParent = 0

   ORDER BY sequence, ParentID, Sort_Order

这导致:

Parent
  - child
Parent
  - child
  - child

我遇到的困难是让结果服从Sort_Order,以便父母处于正确的排序顺序,并且这些父母下的孩子处于正确的排序顺序。现在它正在根据父类别的ID进行排序。

不确定高级分组或如何处理它。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

我就是这样做的,假设父子关系代表的树只有两层深。

SELECT *
FROM
(
  SELECT p.CategoryID
       , p.Category_Name
       , p.IsParent
       , p.ParentID
       , p.Active
       , p.Sort_Order as Primary_Sort_Order
       , NULL as Secondary_Sort_Order
  FROM tbl_Category p
  WHERE p.IsParent = 1
  UNION
  SELECT c.CategoryID
       , ' - ' + c.Category_Name AS Category_Name
       , c.IsParent
       , c.ParentID
       , c.Active
       , a.Sort_Order as Primary_Sort_Order
       , c.Sort_Order as Secondary_Sort_Order
  FROM tbl_Category c
  JOIN tbl_Category a on c.ParentID = a.CategoryID
  WHERE c.IsParent = 0
  AND a.IsParent = 1
) x
ORDER BY Primary_Sort_Order ASC
       , (CASE WHEN Secondary_Sort_Order IS NULL THEN 0 ELSE 1 END) ASC
       , Secondary_Sort_Order ASC

Primary_Sort_Order首先将父母及其子女作为一组进行排序。然后在主要组内,强制使用Secondary_Sort_Order的NULL值,然后按Secondary_Sort_Order的常规非NULL值进行排序。

答案 1 :(得分:1)

经过大量搜索,我为此类问题提供了解决方案,它可以解决您的问题。 在这里,我还有另一个排序顺序列,用于选择与其父记录相同的排序顺序。使用此二级SortOrder首先对记录进行排序,然后将子记录分组在Parent

CASE WHEN ParentID = 0 THEN CategoryID ELSE ParentID END,  
CASE WHEN ParentID = 0 THEN 0 ELSE Primary_Sort_Order END,

这用于将其父字段下的子字段分组。

最终解决方案如

SELECT * FROM
    (
     SELECT p.CategoryID
       , p.Category_Name
       , p.IsParent
       , p.ParentID
       , p.Active
       , p.Sort_Order AS Primary_Sort_Order
       , CASE WHEN p.IsParent = 0 THEN (SELECT Sort_Order FROM tbl_Category WHERE 
     CategoryID = p.ParentID) ELSE p.Sort_Order END AS Secondary_Sort_Order
      FROM tbl_Category p
    ) x
    ORDER BY Secondary_Sort_Order,
            CASE WHEN ParentID = 0 THEN CategoryID ELSE ParentID END,
CASE WHEN ParentID = 0 THEN 0 ELSE Primary_Sort_Order END, Primary_Sort_Order ASC

希望有帮助...!

答案 2 :(得分:0)

如果我正确理解了问题,您希望通过2个不同的索引对数据进行排序:
 1.对于父母
 2.对于孩子们

假设我这样做,我会尝试将ORDER BY子句更改为:

ORDER BY 
CASE WHEN p.IsParent = 1 THEN CATEGORY NAME ELSE PARENT NAME END, 
p.IsParent

这有点粗糙,因为我不知道数据是什么样的 如果您添加一些示例数据,我将尝试制作一个有效的示例。

<强> ===编辑===

如果我假设以下(简化)数据:

╔═══════════════════════╗
║ ID Parent_ID IsParent ║
╠═══════════════════════╣
║ 1   0        1        ║
║ 2   5        0        ║
║ 3   5        0        ║
║ 4   1        0        ║
║ 5   0        1        ║
║ 6   5        0        ║
╚═══════════════════════╝

我希望以下输出顺序:

-1
  -4
-5
  -2
  -3
  -6

为了做到这一点,您需要在ORDER BYIDIsParent = 1ParentIDIsParent = 0列{} 您可以使用二级订单按ID订购子项。

希望这能为你解决一些问题。