id parent_id
1%0
2%0
3 2
4%0
5 1
6%0
我需要一个查询,它将返回父行(parent_id=0),后跟其子行
第一个父级
第一个父项的所有子项
第二个父级
第二个父对象的所有子对象
第三个父级
第四个父级
预期结果:按id排序
id parent_id
%1%0(第一个父级)
5%1(第一个父对象的所有子对象)
2%0第二个父级
3 2(第二个父对象的所有子对象)
4 0第三个父级
6 0第四个父级
我可以使用父母联盟,然后是所有孩子,但这会让我先有父母,然后是孩子。我需要父级和它的子级。
有人能帮上忙吗?
发布于 2010-02-20 21:20:10
为此,您将使用递归CTE:
WITH r AS
(SELECT id,
NULL AS parent_id,
CAST(right('000' + CAST(row_number()
OVER (table.id) AS varchar), 3) AS varchar(50))
FROM table WHERE parent IS NULL
UNION ALL
SELECT table.id, table.parent_id,
CAST(r.ord + right('000' + CAST(row_number()
OVER (ORDER BY table.id) AS varchar), 3) AS varchar(50))
FROM r JOIN table
ON table.parent = r.id)
SELECT id
FROM r
ORDER BY left(ord + '000000000000000000000000000000000', 36)请注意,如果任何ID的值大于999,则此特定版本将中断,如果您有超过12个级别,它将中断。如果这是您关心的问题,您需要调整各个位置的零的数量。
也许还有更好的方法,但这一种方法有效。
发布于 2010-02-20 20:03:26
下面是一个使用带有order by子句的联合的示例解决方案(尽管它不适用于深度嵌套)。
SELECT p.id,
p.parent_id,
p.name,
p.id AS sequence
FROM topics AS p
WHERE p.parent_id = 0
UNION
SELECT t.id,
t.parent_id,
t.name,
t.parent_id AS sequence
FROM topics AS t
WHERE t.parent_id <> 0
ORDER BY sequence, parent_id, name发布于 2009-10-22 09:43:58
据我所知,如果您存储的都是父id,则不能使用单个SQL语句完成此操作。如果您需要快速检索数据树,则必须考虑存储预排序遍历。它比听起来更简单,这里描述得很好:http://articles.sitepoint.com/article/hierarchical-data-database
https://stackoverflow.com/questions/1604537
复制相似问题