我有一个table
类别,其int
字段可以引用同一个表中的primary key
。
ID category isSubCategoryOf orderingNumber
3 "red t-shirts" 2 2
1 "clothes" NULL 1
4 "cars" NULL 1
6 "Baby toys" 5 1
5 "Toys" NULL 1
2 "t-shirt" 1 1
我希望table
为订单,以便在每个类别下列出所有子类别,并在该类别下列出所有子类别。
ID category isSubCategoryOf orderingNumber
1 "clothes" NULL 1
2 "t-shirt" 1 1
3 "red t-shirts" 2 2
4 "cars" NULL 1
5 "Toys" NULL 1
6 "Baby toys" 5 1
是否可以使用SQL
这样做,或者我必须手动订购?
答案 0 :(得分:4)
我理解您的需求,您需要一个递归查询来处理您的分层数据:
WITH recCTE AS
(
--recursive seed
SELECT
category,
ID,
isSubCategoryOf as ParentID,
orderingNumber,
CAST(ID as VARCHAR(100)) as Path,
1 as depth
FROM table
WHERE isSubCategoryOf IS NULL
UNION ALL
--recursive term
SELECT
table.category,
table.id,
table.isSubCategoryOf,
table.orderingNumber,
recCTE.path + '>' + table.id,
recCTE.depth + 1
FROM recCTE
INNER JOIN table ON
recCTE.ID = table.isSubCategoryOf
)
SELECT * FROM recCTE ORDER BY path
递归查询由三部分组成。
递归种子,它是递归查找的起点。在你的情况下,它是任何带有isSubCategoryOf
的记录。您可以将这些视为层次结构的根。
递归术语,它是引用回自身的递归CTE的一部分。它会迭代,直到它没有为层次结构的每个分支创建记录
从递归CTE中选择的最终Select语句。
在这里,我创建了一个路径字段,将每个ID作为hieararchy的一部分拼接在一起。这为您提供了可以排序的字段,以便按要求进行分层排序。
看来,对于您的数据,您的orderingNumber
类似于我在上面的递归CTE中添加的depth
字段。如果是这种情况,那么您可以从CTE中删除该字段并保存一些处理。
答案 1 :(得分:0)
如果你只是想要sotrt和打印,你可以制作计算列
select ID, category, isSubCategoryOf, orderingNumber, ID + '_' + isSubCategoryOf as SortOrder
from table
order by ID + '_' + isSubCategoryOf