2008-10-24 39 views
11

Cách quay lại khi tôi đang làm việc trong một cửa hàng Oracle, tôi đã sử dụng CONNECT_BY. Bây giờ tôi đang mắc kẹt làm việc với SQL Server 2005 và có một số hệ thống phân cấp đối tượng khó chịu. Cụ thể, chúng ta có một bảng tham chiếu tự trong đó tất cả các bản ghi con có một cột với id của cha mẹ chúng. Hiện tại chúng tôi có chế độ xem để ánh xạ trẻ em ở cấp độ trong hệ thống phân cấp và một truy vấn khó chịu làm việc nâng hạng nặng để kết nối cha mẹ với con cái của họ. Trong khi phương pháp này hoạt động, nó là xa thanh lịch và reeks của taint. Tôi chỉ tò mò làm thế nào những người khác lấy dữ liệu phân cấp từ SQL Server 2005.Truy vấn phân cấp trong SQL Server 2005

Trả lời

1

trong SQL Server 2005, bạn có thể sử dụng biểu thức bảng chung (CTE) cho việc này.

+0

lực đệ quy là VỚI() bạn. Har har har. –

+0

Bạn có thể hiển thị ví dụ không? –

25

Điều này tạo bảng phân cấp điển hình của bạn và sử dụng CTE để chọn cấu trúc phân cấp và tạo đường dẫn cho từng mục.

CREATE TABLE tblHierarchy (ID int, ParentID int NULL, Name varchar(128)); 

INSERT INTO tblHierarchy VALUES (1, NULL, '1'); 
INSERT INTO tblHierarchy VALUES (2, NULL, '2'); 
INSERT INTO tblHierarchy VALUES (3, NULL, '3'); 
INSERT INTO tblHierarchy VALUES (4, 1, '1.1'); 
INSERT INTO tblHierarchy VALUES (5, 1, '1.2'); 
INSERT INTO tblHierarchy VALUES (6, 4, '1.1.1'); 

WITH Parent AS 
(
    SELECT 
     ID, 
     ParentID, 
     Name AS Path 
    FROM 
     tblHierarchy 
    WHERE 
     ParentID IS NULL 

    UNION ALL 

    SELECT 
     TH.ID, 
     TH.ParentID, 
     CONVERT(varchar(128), Parent.Path + '/' + TH.Name) AS Path 
    FROM 
     tblHierarchy TH 
    INNER JOIN 
     Parent 
    ON 
     Parent.ID = TH.ParentID 
) 
SELECT * FROM Parent 

OUTPUT:

ID ParentID Path 
1 NULL  1 
2 NULL  2 
3 NULL  3 
4 1  1/1.1 
5 1  1/1.2 
6 4  1/1.1/1.1.1 
3

Just FYI. SQL Server 2008 hỗ trợ kiểu dữ liệu mới Hierarchy ID.

2

đọc này:

http://www.sitepoint.com/article/hierarchical-data-database/2/

Nó sẽ cho bạn một số ý tưởng ...

+0

Có, bộ lồng nhau chắc chắn là cách để đi cho hệ thống phân cấp không giới hạn trong một RDBMS. Mô tả của Sitepoint khiến cho nó phức tạp hơn một chút so với thực tế, và việc triển khai có thể được đơn giản hóa, ví dụ. bằng cách 'xếp thứ tự' và 'xếp hạng anh chị em' thay vì 'trái' và 'phải'. – bobince

3

Sau khi sử dụng cả hai, tôi thấy CONNECT BY có phần linh hoạt hơn và dễ dàng hơn để sử dụng hơn CTE của. Câu hỏi không khác với câu hỏi tôi đã trả lời cách đây vài tuần. Xem Here để so sánh ngắn gọn về CONNECT BY và CTE's và Here để biết ví dụ về truy vấn sử dụng CTE's.

+0

Tough may mắn rằng CONNECT BY không tồn tại trong MSSQL. –

0

Để đi qua Depth của Hierarchy đầu tiên sau đó mức độ anh chị em hôm sau, CTE có thể được sử dụng:

declare @tempTable TABLE 
(
    ORGUID int, 
    ORGNAME nvarchar(100), 
    PARENTORGUID int, 
    ORGPATH nvarchar(max) 
) 

;WITH RECORG(ORGuid, ORGNAME, PARENTORGUID, ORGPATH) 
as 
(
    select 
     org.UID, 
     org.Name, 
     org.ParentOrganizationUID, 
     dbo.fGetOrganizationBreadcrumbs(org.UID) 
    from Organization org 
    where org.UID =1 

    union all 

    select 
     orgRec.UID, 
     orgRec.Name, 
     orgRec.ParentOrganizationUID, 
     dbo.fGetOrganizationBreadcrumbs(orgRec.UID) 
    from Organization orgRec 
    inner join RECORG recOrg on orgRec.ParentOrganizationUID = recOrg.ORGuid 

) 
insert into @tempTable(ORGUID, ORGNAME, PARENTORGUID,ORGPATH) 

select ORGUID, ORGNAME, PARENTORGUID,ORGPATH 
from RECORG rec 

select * 
from @tempTable where ORGUID in(select MIN(tt.ORGUID) 
           from @tempTable tt 
           group by tt.PARENTORGUID) 
Các vấn đề liên quan