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
trong SQL Server 2005, bạn có thể sử dụng biểu thức bảng chung (CTE) cho việc này.
Đ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
Just FYI. SQL Server 2008 hỗ trợ kiểu dữ liệu mới Hierarchy ID.
đọc này:
http://www.sitepoint.com/article/hierarchical-data-database/2/
Nó sẽ cho bạn một số ý tưởng ...
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
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.
Tough may mắn rằng CONNECT BY không tồn tại trong MSSQL. –
Để đ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)
- 1. SQL Server 2005 Dấu thời gian ngày Truy vấn
- 2. Cách sử dụng truy vấn chọn bên trong truy vấn chèn trong SQL Server 2005
- 3. Vấn đề chặn SQL Server 2005 (ASYNC_NETWORK_IO)
- 4. Truy vấn Active Directory từ SQL Server 2005
- 5. Hạ cấp máy chủ SQL 2008 sang SQL Server 2005
- 6. Phân trang SQL Server 2005 Kết quả
- 7. Truy vấn SQL để thêm cột mới sau cột hiện có trong SQL Server 2005
- 8. Isoweek trong SQL Server 2005
- 9. SQL Server 2005 Replication
- 10. Cách cập nhật trình phân giải xung đột khi nâng cấp từ SQL Server 2005 lên SQL-Server 2008
- 11. Thời gian truy cậpZoneInfo từ SQL 2005 Server
- 12. Cách tạo thư mục hệ thống tệp trong cuộc gọi/truy vấn SQL Server 2005
- 13. Làm cách nào để khôi phục truy vấn UPDATE trong SQL Server 2005?
- 14. CHECKSUM() va chạm trong SQL Server 2005
- 15. Số Ba Tư trong SQL Server 2005
- 16. Truy vấn SQL Server từ PHP
- 17. Truy vấn đệ quy SQL Server
- 18. Giải pháp phân trang tốt nhất bằng SQL Server 2005?
- 19. Truy vấn phân cấp trong MySQL
- 20. Mẹo và thủ thuật về tối ưu hóa truy vấn [SQL Server 2005]
- 21. SQL Server 2005 Đặt biến thành kết quả của truy vấn chọn
- 22. Nâng cấp SQL Server 6.5
- 23. Tôi cần truy vấn chậm trên AdventureWorks (SQL 2005)
- 24. SQL Server 2005: Chèn nhiều hàng với một truy vấn đơn
- 25. SQL server 2005 mất chính xác số
- 26. SQL Server 2005 Làm thế nào để bạn xóa một kế hoạch thực thi truy vấn
- 27. Sql Truy vấn để liệt kê tất cả các khung nhìn trong cơ sở dữ liệu SQL Server 2005
- 28. Chính xác SQL Server 2005 là gì?
- 29. Truy vấn Tab Sql Server 2008
- 30. Tắt lời nhắc "lưu" trong SQL Server Management Studio 2005
lực đệ quy là VỚI() bạn. Har har har. –
Bạn có thể hiển thị ví dụ không? –