2010-01-13 9 views
0

J'ai une base de données SQL Server avec ces pages:SQL Server: Comment sélectionner parentid deuxième plus haut?

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

Comment puis-je sélectionner le deuxième plus haut (en niveau) parentid pour une ligne? Donc pour pageid = 6 (Voir tout) il devrait retourner parentid-> 3 (Utilisateur).

+1

Cette question a un titre trompeur. Peut-être que cela devrait être «Trouver le parent d'un parent», ou quelque chose comme ça. –

Répondre

2

Pour un nombre fixe et connu des étapes la hiérarchie mère, utilisez jointures explicites:

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; 

Pour un nombre Unknow d'étapes dans la hiérarchie, utilisez une cte récursive, mais vous avez besoin d'un critère d'arrêt, voir Recursive Queries Using Common Table Expressions.

+0

Oups, je suppose que c'est exactement ce dont j'ai besoin. Cependant, je ne comprends pas tout à fait comment cela fonctionne ... Aussi, j'utilise la version express de SQL Server. Peut-il y avoir une solution plus simple? – Ropstah

0

Essayez:

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

Je ne pouvais pas prendre de votre question et votre exemple si vous voulez pageid ou parentid.

+0

Une bonne réponse, mais pour une question différente. Ce message concerne une arborescence, et la question est de savoir comment trouver le parent du parent d'un nœud. –