私が最初に行うことは、目的の列を取り除くことです-階層の観点からは意味がありません(実際には、生きている子行を表現した方法で通知するための一種の2番目の主キーのように見えます)
これは与えるだろう
ID, Item, parentID
1, Applications, (null)
2, Games, (null)
3, Office, 1
4, Text Editing, 1
5, Media, (null)
6, Word, 3
7, Excel, 3
8, Crysis, 2
例えば..
ワード > オフィス > アプリケーションと...
エクセル > オフィス > アプリケーション
...おそらく同じメニュー項目にあるはずです(親ID 3)
どのようにメニューを選択しているのかわかりませんが、パラメーターとして (null) が設定された最初のメニュー ボタンがあり、その後の各クリックで動的に次のパラメーターが順番に保持されるという原則に取り組みます (これは一致するようです)。あなたのコメント)
例えば
最上位メニューをクリック:- 値は (null)
アプリケーションをクリックします:- 値は 1 です
Office をクリック:- 値は 3
等
destinationID がアクティブな子リンクを表示する (削除できるようにする) 以外に何もしていないと仮定すると、コードは次のようになります。
with items (nodeID, PID, list) as
(select id, ParentID, item
from menu
where id = 9
union all
select id, ParentID, item
from menu
inner join items on nodeID = menu.ParentID
)
select *
from items
where (pid = 9)
and nodeID in (select parentid from menu)
これは MSSQL 2005+ で動作します
他の理由で宛先 ID が必要な場合は、次のようにコードを修正できます (たとえば、ノード ID が親 ID として設定されていない最下位レベルを返す必要がある場合)。
with items (nodeID, PID, list, dest) as
(select id, ParentID, item, destinationID
from menu
where id = 9
union all
select id, ParentID, item, destinationID
from menu
inner join items on nodeID = menu.ParentID
)
select *
from items
where (pid = 9)
and (nodeID in (select parentid from menu)
or dest is not null)