2011-01-11 13 views
0

我在SQL Server 2005上工作並且最低。在SQL中如何通過列值得到父相關值

我有一個SQL Server表的結構如下圖所示:

ID Name  ParentID 
----------------------- 
1  Root  NULL 
2  Business 1 
3  Finance 1 
4  Stock  3 

我想編寫一個查詢,當用戶給輸入ID = 1,則表明該輸出在這裏:

ID Name  ParentName 
------------------------- 
1  Root  - 
2  Business Root 
3  Finance Root 
4  Stock  Finance  

當用戶輸入ID = 3,然後在此處顯示此輸出:

ID Name  ParentName 
------------------------- 
3  Finance Root 
1  Root  - 
4  Stock  Finance 

當用戶輸入ID = 4時,顯示此輸出:

ID Name  ParentName 
------------------------- 
4  Stock  Finance  
3  Finance Root 
1  Root  - 

在此先感謝。如果有任何查詢請求。謝謝大家

+2

基於該ID顯示列表的邏輯是什麼?我能看到的唯一模式是輸入ID在先。 – GONeale 2011-01-11 06:10:32

+0

我有兩個關於父 - 子關係的表格需要顯示詳細記錄。我忘了告訴關於詳細信息表。希望你明白,爲什麼我需要這種類型的查詢 – shamim 2011-01-11 06:17:56

+0

如何獲得結果與CTE – shamim 2011-01-11 09:23:57

回答

2
SELECT t1.ID, t1.Name, t2.Name AS ParentName FROM tableName t1 
LEFT JOIN tableName t2 on t1.ID = t2.ParentID 

明顯地用你的表代替tableName。 添加t2.ID選擇列表查看匹配,如果你喜歡。

0

這兩個遞歸CTE(公用表表達式)將從樹中的給定節點向下選擇層次結構,並從樹上的該節點返回到根。由於它是一個CTE,它將在SQL Server 2005和更新的版本中工作 - 但在SQL Server 2000中不是而是,不幸的是。

DECLARE @StartID INT 
SET @StartID = 1 

;WITH DownHierarchy AS 
(
    SELECT ID, Name, ParentID 
    FROM dbo.YourTable 
    WHERE ID = @StartID 

    UNION ALL 

    SELECT d.ID, d.Name, d.ParentID 
    FROM dbo.YourTable d 
    INNER JOIN DownHierarchy h ON d.ParentID = h.ID 
), 
UpHierarchy AS 
(
    SELECT ID, Name, ParentID 
    FROM dbo.YourTable 
    WHERE ID = @StartID 

    UNION ALL 

    SELECT d.ID, d.Name, d.ParentID 
    FROM dbo.YourTable d 
    INNER JOIN UpHierarchy h ON d.ID = h.ParentID 
) 
SELECT * 
FROM DownHierarchy 
UNION 
SELECT * 
FROM UpHierarchy 

設置@StartID = 1會給你這樣的輸出:

ID Name ParentID 
1 Root  NULL 
2 Business 1 
3 Finance 1 
4 Stock  3 

設置@StartID = 3會給你這樣的輸出:

ID Name  ParentID 
1 Root  NULL 
3 Finance 1 
4 Stock  3 
0

這裏的修改marc_s'回答:

Declare @data table 
(ID bigint identity(1,1) ,Name varchar(100), ParentID bigint) 

Insert into @data SELECT 'Root',NULL 
Insert into @data SELECT 'Business',1 
Insert into @data SELECT 'Finance',1 
Insert into @data SELECT 'Stock',3 


DECLARE @StartID INT 
SET @StartID = 3 

;WITH DownHierarchy AS 
(
    SELECT ID, Name, ParentID 
    FROM @data 
    WHERE ID = @StartID 

    UNION ALL 

    SELECT d.ID, d.Name, d.ParentID 
    FROM @data d 
    INNER JOIN DownHierarchy h ON d.ParentID = h.ID 
), 
UpHierarchy AS 
(
    SELECT ID, Name, ParentID 
    FROM @data 
    WHERE ID = @StartID 

    UNION ALL 

    SELECT d.ID, d.Name, d.ParentID 
    FROM @data d 
    INNER JOIN UpHierarchy h ON d.ID = h.ParentID 
) 
SELECT * 
FROM DownHierarchy 
UNION 
SELECT * 
FROM UpHierarchy 
0

我有一個類似的答案 - 不過話說建它,我想它張貼;)

declare @Data table (
    ID int not null, 
    Name varchar(50) not null, 
    ParentID int null 
); 

insert into @Data 
select 1, 'Root', null 
union select 2, 'Business', 1 
union select 3, 'Finance', 1 
union select 4, 'Stock', 3; 

declare @UserInput int; 
set @UserInput = 4; 

with cParents as (
    select d.ID, d.Name, d.ParentID 
    from @Data d 
    where d.ID = @UserInput 
    union all 
    select d.ID, d.Name, d.ParentID 
    from cParents c 
    inner join @Data d 
     on d.ID = c.ParentID 
), 
cChildren as (
    select d.ID, d.Name, d.ParentID 
    from @Data d 
    where d.ID = @UserInput 
    union all 
    select d.ID, d.Name, d.ParentID 
    from cChildren c 
    inner join @Data d 
     on d.ParentID = c.ID 
) 
select RecordType='self', d.ID, d.Name, ParentName=isnull(p.Name,'') 
from @Data d 
left join @Data p 
    on p.ID = d.ParentID 
where d.ID = @UserInput 

union all 

select RecordType='parents', d.ID, d.Name, ParentName=isnull(p.Name,'') 
from cParents d 
left join @Data p 
    on p.ID = d.ParentID 
where d.ID <> @UserInput 

union all 

select RecordType='children', d.ID, d.Name, ParentName=isnull(p.Name,'') 
from cChildren d 
left join @Data p 
    on p.ID = d.ParentID 
where d.ID <> @UserInput; 

@Data代表樣本數據,@UserInput是輸入變量。 我添加了一個RecordType來闡明記錄部分的含義。 它在SQL Server 2008上測試過,應該可以在2005上運行 - 但不能在2000上運行。