2010-01-13 77 views
0

我有这些页面的SQL Server数据库: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      | 
+------------+--------------+-------------------------------+ 

如何选择任何行的第二高(电平)的parentid?因此,对于pageid = 6(查看全部),它应该返回parentid-> 3(用户)。

+1

这个问题有一个令人误解的标题。也许它应该是“寻找父母的父母”,或者其他什么 – 2010-01-14 00:20:01

回答

2

对于一个固定的和已知的步数最多父层次结构,使用显式联接:

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,但你需要一个停止标准,见Recursive Queries Using Common Table Expressions

+0

哎呀,我想这正是我需要的。然而,我不明白这是如何工作的...还有,我正在使用sql server的快速版本。可能会有更简单的解决方案吗? – Ropstah 2010-01-14 01:08:24

0

尝试:

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

是否要的pageid或parentId的我无法从你的问题,你的样品挑选。

+0

一个很好的答案,但是对于一个不同的问题。 这篇文章涉及到一个树层次结构,问题是如何找到一个节点父层的父节点。 – 2010-01-14 00:18:59