我在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 -
提前致谢。如果有任何查询请问。谢谢所有
答案 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年使用。