在SQL中如何按列值获取父相关值

时间:2011-01-11 06:00:22

标签: sql sql-server sql-server-2005 sql-server-2000

我在SQL Server 2005上工作且最低。

我有一个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      -

提前致谢。如果有任何查询请问。谢谢所有

4 个答案:

答案 0 :(得分: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以选择列表以查看匹配。

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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年使用。