我使用的嵌套集模型稍後將用於爲我的網站構建網站地圖。這是我的表格結構。按名稱對嵌套集進行排序,同時保持深度完整
create table departments (
id int identity(0, 1) primary key
, lft int
, rgt int
, name nvarchar(60)
);
insert into departments (lft, rgt, name) values (1, 10, 'departments');
insert into departments (lft, rgt, name) values (2, 3, 'd');
insert into departments (lft, rgt, name) values (4, 9, 'a');
insert into departments (lft, rgt, name) values (5, 6, 'b');
insert into departments (lft, rgt, name) values (7, 8, 'c');
如何根據深度和名稱進行排序?我能做
select
replicate('----', count(parent.name) - 1) + ' ' + node.name
, count(parent.name) - 1 as depth
, node.lft
from
departments node
, departments parent
where
node.lft between parent.lft and parent.rgt
group by
node.name, node.lft
order by
depth asc, node.name asc;
但是,由於某種原因,這與孩子的父母不符。
department lft rgt
---------------------------
departments 0 1
---- a 1 4
---- d 1 2
-------- b 2 5
-------- c 2 7
正如你所看到的,部門'd'有部門'a的孩子!
謝謝。
貌似WITH子句是SQL服務器> 2005。任何方式來複制查詢的功能可能是內聯視圖? – Mike 2010-06-16 18:29:12
我不這麼認爲。不幸的是,這基本上涉及遞歸,因爲您必須從所有後代獲取名稱。具有諷刺意味的是,這是使用嵌套集模型的最大原因之一 - 擺脫遞歸。當然,鏈表模式也無助於避免遞歸。 – 2010-06-16 18:37:24
順便說一句,你可能已經注意到了這一點,但一個簡單的「ORDER BY lft」幾乎讓你在那裏 - 孩子們坐在父母的下方,但在深度之內,它不是按字母順序排序。 – 2010-06-16 18:39:02