我在数据库中对项目进行排序时遇到了这个小问题。
表数据是这样的:
id | description | parent | rowlevel
100 | item 12222 | -none- | 0
SET | item 12345 | -none- | 0
201 | item 22345 | -SET - | 1
我想在“id”上输出排序,但也要按照“childen”在“父母”之后的方式排序。
我知道使用不同的表格布局会更容易,但更改不是一个选项。
计划结果将是:
id | description | parent | rowlevel
100 | item 12222 | -none- | 0
SET | item 12345 | -none- | 0
201 | item 22345 | -SET - | 1
301 | item 22345 | -SET - | 1
401 | item 22345 | -SET - | 1
ST2 | item 12345 | -none- | 0
211 | item 22345 | -ST2 - | 1
321 | item 22345 | -ST2 - | 1
101 | item 22345 | -ST2 - | 1
我尝试过使用order by但是虽然它的结果是rowlevel 1项,但是item的父结果在底部。和其他父母一起。
我不是使用连接的经验,并且没有线索,如果它可以在表本身上有一个连接来解决这个问题。 我能想到的唯一想法是某种嵌套的SQL查询。 但除此之外,我不确定这是否有效。我也担心这会占用资源并对性能产生很大影响。
答案 0 :(得分:0)
只要您只有1个级别,只需在SQL中添加以下订单条件:
ORDER BY COALESCE(parent, id), rowlevel
(假设-none-
实际上是null
而SET
/ -SET -
实际上是某种数字ID。)
如果你有超过1级的嵌套,你将需要某种递归CTE。
答案 1 :(得分:0)
您可以使用recursive CTE:
WITH CTE AS
(
SELECT t1.[id], t1.[description], t1.[parent],
[rowlevel] = 0
FROM dbo.Table1 t1
WHERE t1.parent = '-none-'
UNION ALL
SELECT t2.[id], t2.[description], t2.[parent],
[rowlevel] = CTE.[rowlevel] + 1
FROM dbo.Table1 t2 INNER JOIN CTE
ON t2.parent = CTE.id
)
SELECT * FROM CTE
ORDER BY rowlevel, id