Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL Server树查询_Sql Server 2008_Hierarchical Data - Fatal编程技术网

Sql server 2008 SQL Server树查询

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

我需要一些帮助是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 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