Первое, что я хотел бы сделать, это удалить столбец назначения - он не имеет смысла с точки зрения иерархии (на самом деле он кажется своего рода вторым первичным ключом, сигнализирующим о живой дочерней строке, как вы ее представляли)
это даст
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
например ...
слово> офис> приложения и ...
excel> офис> приложения
... предположительно должен находиться в том же пункте меню (родительский идентификатор 3)
Я не уверен, как вы выбираете меню, но я буду работать по принципу, что есть начальная кнопка меню, установленная с (нулевым) в качестве ее параметра, и каждый последующий щелчок динамически удерживает следующий параметр в последовательности (что похоже соответствует вашим комментариям)
например.
щелкните меню верхнего уровня: - значение равно (null)
нажмите приложения: - значение 1
нажмите Офис: - значение 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 +
Если вам нужен идентификатор назначения по какой-либо другой причине, вы можете изменить код следующим образом (например, если вам нужно вернуть самый низкий уровень, где идентификатор узла не был установлен в качестве родительского идентификатора, например):
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)