Sql server 2008 SQL Server树查询
我需要一些帮助是MS SQL Server查询。我不是什么DBA。我有一个应用程序,其组织表由父子关系组成:Sql server 2008 SQL Server树查询,sql-server-2008,hierarchical-data,Sql Server 2008,Hierarchical Data,我需要一些帮助是MS SQL Server查询。我不是什么DBA。我有一个应用程序,其组织表由父子关系组成: CREATE TABLE [dbo].[Organizations]( [OrgPK] [int] IDENTITY(1,1) NOT NULL, [OrgParentFK] [int] NULL, [OrgName] [varchar](200) NOT NULL, CONSTRAINT [PK__Organizations] PRIMARY KEY CLUST
CREATE TABLE [dbo].[Organizations](
[OrgPK] [int] IDENTITY(1,1) NOT NULL,
[OrgParentFK] [int] NULL,
[OrgName] [varchar](200) NOT NULL,
CONSTRAINT [PK__Organizations] PRIMARY KEY CLUSTERED
示例数据如下所示:
OrgPK, OrgParentFK, OrgName
1, 0, Corporate
2, 1, Department A
3, 1, Department B
4, 2, Division 1
5, 2, Division 2
6, 3, Division 1
7, 6, Section 1
8, 6, Section 2
我试图生成一个查询,返回基于给定OrgPK的组织路径。例如,如果给定OrgPK=7,查询将返回“公司/部门B/部门1/部门1”
如果give OrgPk=5,返回字符串将为“公司/部门A/部门2”
谢谢你的帮助
WITH OrganizationsH (OrgParentFK, OrgPK, OrgName, level, Label) AS
(
SELECT OrgParentFK, OrgPK, OrgName, 0, CAST(OrgName AS VARCHAR(MAX)) As Label
FROM Organizations
WHERE OrgParentFK IS NULL
UNION ALL
SELECT o.OrgParentFK, o.OrgPK, o.OrgName, level + 1, CAST(h.Label + '/' + o.OrgName VARCHAR(MAX)) As Label
FROM Organizations o JOIN OrganizationsH h ON o.OrgParentFK = h.OrgPK
)
SELECT OrgParentFK, OrgPK, OrgName, level, Label
FROM OrganizationsH
WHERE OrgPK = 5
h/t到marc_s也可以通过创建标量值函数来解决:
-- SELECT [dbo].[ListTree](5)
CREATE FUNCTION [dbo].[ListTree](@OrgPK int)
RETURNS varchar(max)
AS
BEGIN
declare @Tree varchar(MAX)
set @Tree = ''
while(exists(select * from dbo.Organizations where OrgPK=@OrgPK))
begin
select @Tree=OrgName+'/'+@Tree,
@OrgPK=OrgParentFK
from dbo.Organizations
where OrgPK=@OrgPK
end
return left(@Tree,len(@Tree)-1)
END
您对
OrgParentFK
有外键约束吗?您可能必须在“Label”条目周围放置CAST(..…AS VARCHAR(MAX))
(否则您将得到:“Msg 240,Level 16,State 1,Line 11-递归查询“OrganizationsH”的“Label”列中的锚和递归部分之间的类型不匹配。”-但除此之外:该死,比我快!!:-)@marc-s有趣,我不知道。两个位置都需要CAST
?