2012-04-16 34 views
6

Dưới đây là cấu trúc ví dụ về bảng:Làm thế nào để hiển thị ParentID đệ quy trong một cột duy nhất trong SQL

ID Name  ParentID 
----------------------- 
1  Ancestor  NULL 
2  GrandFather 1 
3  GrandMother 1 
4  Child   3 

Tôi đang cố gắng để viết một truy vấn mà sẽ trở

ID  Name  Family 
---------------------------- 
1  Ancestor 
2  GrandFather Ancestor 
3  GrandMother Ancestor 
4  Child  Ancestor^GrandMother 

Các khó khăn một phần là tôi muốn hiển thị họ của tất cả các hàng và theo thứ tự từ trên xuống.

Nếu bất cứ ai có thể chỉ cho tôi đi đúng hướng, nó sẽ được đánh giá cao :)

EDIT :: Đây là câu hỏi thật, nhưng nó theo ý tưởng tương tự. nó sẽ trả về một lỗi trên dòng: marketparent.family + '^' + t2.marketGroupName bởi vì nó không thể tìm thấy marketparent

WITH marketparent (marketGroupID,parentGroupID, marketGroupName,family) 
AS 
(
SELECT marketGroupID, 
     parentGroupID, 
     marketGroupName, 
     '' as family 
FROM EVE.dbo.invMarketGroups 
WHERE parentGroupID IS NULL 
UNION ALL 

    SELECT t2.parentGroupID, 
    t2.marketGroupID, 
    t2.marketGroupName, 
    marketparent.family + '^'+ t2.marketGroupName 
    FROM EVE.dbo.invMarketGroups as t2 
    INNER JOIN marketparent as mp 
    ON mp.marketGroupID = t2.parentGroupID 
) 

-- Statement using the CTE 

SELECT TOP 10 * 
FROM marketparent; 
+3

Các giải pháp sẽ phụ thuộc vào DBMS bạn sử dụng. SQL Server, Oracle, MySQL hoặc ....? –

+0

Tôi đang sử dụng SQL Server 2008 – darthun08

+0

Sử dụng bí danh 'mp' thay vì' marketparent'. –

Trả lời

5

Bạn không nói rõ DBMS của bạn, vì vậy tôi giả định PostgreSQL

WITH RECURSIVE fam_tree (id, name, parent, family) as 
(
    SELECT id, 
     name, 
     parentid, 
     ''::text as family 
    FROM the_unknown_table 
    WHERE parent IS NULL 

    UNION ALL 

    SELECT t2.id, 
     t2.name, 
     t2.parentid, 
     fam_tree.family || '^' || t2.name 
    FROM the_unknown_table t2 
    INNER JOIN fam_tree ON fam_tree.id = t2.parentid 
) 
SELECT * 
FROM fam_tree; 

Đây là SQL tiêu chuẩn (ngoại trừ kiểu gõ ::text) nên hoạt động với rất ít thay đổi trên hầu hết các DBMS hiện đại.

Sửa:

Đối với SQL Server bạn sẽ cần phải thay thế các nhân vật concatention tiêu chuẩn với của Microsoft không standar + (và bạn cần phải loại bỏ các recursive từ khóa đó là yêu cầu của tiêu chuẩn nhưng vì một lý do kỳ lạ bị từ chối bởi SQL Server)

WITH fam_tree (id, name, parent, family) as 
(
    SELECT id, 
     name, 
     parentid, 
     '' as family 
    FROM the_unknown_table 
    WHERE parent IS NULL 

    UNION ALL 

    SELECT t2.id, 
     t2.name, 
     t2.parentid, 
     fam_tree.family + '^' + t2.name 
    FROM the_unknown_table t2 
    INNER JOIN fam_tree ON fam_tree.id = t2.parentid 
) 
SELECT * 
FROM fam_tree; 
+0

bây giờ nếu tôi muốn tạo gia đình của một hàng nằm trong một bảng khác nhưng có khóa ngoài cho bảng này, tôi có thể thêm một số mã vào truy vấn cuối cùng hay tôi phải đặt thứ gì đó trong WITH? – darthun08

+0

fam_tree.family + '^' + t2.name trả về lỗi: Mã định danh nhiều phần "fam_tree.family" không thể bị ràng buộc. Điều này có thể là do tôi không chỉ định ngôn ngữ chính xác trong câu hỏi của mình. Tôi đang sử dụng MS SQL server 2008, và phần còn lại, tôi không biết bạn cần thông tin gì: P – darthun08

+0

@ user1336586: hmm, 'fam_tree.family + '^' + t2.name' sẽ hoạt động với tất cả Tôi biết. Vì tôi không có bảng của bạn, tôi giả định một số lỗi đánh máy. Hãy thử loại bỏ các định nghĩa cột trong với phần: 'với fam_tree như (...' –

0

Bạn có thể sử dụng đệ quy Common Table Expression.

declare @T table 
(
    ID int, 
    Name nvarchar(15), 
    ParentID int 
); 

insert into @T values 
(1,  N'Ancestor',  NULL), 
(2,  N'GrandFather', 1), 
(3,  N'GrandMother', 1), 
(4,  N'Child',   3); 

with C as 
(
    select T.ID, 
     T.Name, 
     T.ParentID, 
     cast(N' ' as nvarchar(max)) as Family 
    from @T as T 
    where T.ParentID is null 
    union all 
    select T.ID, 
     T.Name, 
     T.ParentID, 
     C.Family+'^'+C.Name 
    from @T as T 
    inner join C 
     on T.ParentID = C.ID 
) 
select C.ID, 
     C.Name, 
     stuff(C.Family, 1, 2, '') as Family 
from C; 
+0

cảm ơn bạn nhiều, tôi sẽ thử rằng – darthun08

+0

@user đã thực hiện công việc này cho bạn? Tôi thấy rằng bạn đã có một số vấn đề với câu trả lời được chấp nhận mà tôi tin rằng sẽ được giải quyết trong câu trả lời của tôi. –

+0

không có nó không hoạt động. Tôi tìm thấy một giải pháp khác mà tôi tạo một bảng mới và cập nhật các giá trị theo cách lặp lại. Nếu bạn có thời gian, hãy tìm kiếm bài đăng mới của tôi, tôi vẫn cần trợ giúp với cùng một điều. – darthun08

0
select T.ID, T.Name, (select name from table where ID=T.ParentID)as Family 
from table T 
+0

truy vấn của bạn dường như chỉ trả lại tên cha của mỗi hàng. đó là một thử tốt đẹp, nhưng tôi đang tìm đường dẫn đầy đủ :) – darthun08

Các vấn đề liên quan