SQL Server: как выбрать второй по значимости парентид? - PullRequest
0 голосов
/ 14 января 2010

У меня есть база данных SQL Server с этими страницами:

+------------+--------------+-------------------------------+  
|  pageid    |  parentid    |  title                        |
+------------+--------------+-------------------------------+  
|  1         |  null        |  Home                         |
+------------+--------------+-------------------------------+  
|  2         |  1           |  News                         |
+------------+--------------+-------------------------------+  
|  3         |  1           |  User                         |
+------------+--------------+-------------------------------+  
|  4         |  3           |  Edit profile                 |
+------------+--------------+-------------------------------+  
|  5         |  3           |  Messages                     |
+------------+--------------+-------------------------------+  
|  6         |  5           |  View all                     |
+------------+--------------+-------------------------------+  

Как выбрать второй по величине (по уровню) парентид для любой строки? Таким образом, для pageid = 6 (Просмотреть все) он должен вернуть parentid-> 3 (Пользователь).

Ответы [ 2 ]

2 голосов
/ 14 января 2010

Для фиксированного и известного количества шагов по иерархии родителей используйте явные объединения:

select l2.*
from table t
join table l1 on t.parent_id = l1.pageid
join table l2 on l1.parent_id = l2.pageid
where t.pageid = 6;

Для неизвестного количества шагов в иерархии используйте рекурсивный cte, но вам нужен критерий остановки, см. Рекурсивные запросы с использованием общих табличных выражений .

0 голосов
/ 14 января 2010

Попробуйте:

select max(thing) from table where thing < (select max(thing) from table)

Я не могу выбрать из вашего вопроса и вашего образца, хотите ли вы Pageid или parentid.

...