나중에 내 웹 사이트의 사이트 맵을 작성하는 데 사용할 중첩 세트 모델을 사용하고 있습니다. 이것은 내 테이블 구조입니다.깊이 통합을 유지하면서 이름별로 중첩 세트 정렬
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의 자녀가 있습니다!
감사합니다.
보인다. 어쩌면 인라인보기에서 쿼리의 기능을 복제하는 방법은 없습니까? – Mike
나는 그렇게 생각하지 않는다. 불행히도 이것은 모든 자손으로부터 이름을 가져와야하기 때문에 기본적으로 재귀가 필요합니다. 아이러니 컬은 중첩 된 모델을 사용하는 가장 큰 이유 중 하나입니다. 재귀를 없애기 위해서입니다. 물론, 연결된 목록 모델은 재귀를 피하는 데 도움이되지 않습니다. –
BTW, 당신은 아마 이미 이것을 알았을 것입니다. 그러나 단순한 "ORDER BY LFT"는 당신을 거의 거기에 데려옵니다 - 아이들은 부모 밑에서 멋지게 앉아 있지만, 깊이 내에서는 알파벳 순으로 정렬되어 있지 않습니다. –