質問
id parent_id
1 0
2 0
3 2
4 0
5 1
6 0
親行(parent_id = 0)に続いて子行を返すクエリが必要です
最初の親
最初の親のすべての子
2番目の親
2番目の親のすべての子
3番目の親
4番目の親
期待される結果:ID順に並べられています
id parent_id
1 0(最初の親)
5 1(最初の親のすべての子)
2 0番目の親
3 2(2番目の親のすべての子)
4 0 3番目の親
6 0 4番目の親
すべての子が続く親の結合を使用できます しかし、それは私に最初に親を与え、次に子供を与えます。 親とすぐにその子が必要です。
誰でも助けてもらえますか?
解決
これには再帰的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レベルを超えると壊れます。これが心配な場合は、さまざまな場所でゼロの数を調整する必要があります。
より良い方法があるかもしれませんが、これは機能します。
他のヒント
これは、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
私が知る限り、保存しているのが親IDだけである場合、1つのSQLステートメントでこれを行うことはできません。データツリーをすばやく取得する必要がある場合は、事前注文のトラバースを保存することを検討する必要があります。見た目よりも簡単で、ここで詳しく説明されています: http://articles.sitepoint。 com / article / hierarchical-data-database
所属していません StackOverflow