Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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 2005 在SQL中递归地从查询结果获取数据_Sql Server 2005_Recursion - Fatal编程技术网

Sql server 2005 在SQL中递归地从查询结果获取数据

Sql server 2005 在SQL中递归地从查询结果获取数据,sql-server-2005,recursion,Sql Server 2005,Recursion,SQL专家 我有一个表结构如下 Id Name IdPartner Id1 name1 Id2 Name2 Id1 Id3 name3 Id1 Id4 name4 Id2 Id5 name5 Id3 我需要编写一个查询,该查询将递归地在表中循环以查找合作伙伴 也就是说,给定一个Id,比如说Id1,我需要提取Id1作为合作伙伴列出的所有名称

SQL专家

我有一个表结构如下

Id        Name        IdPartner
Id1       name1           
Id2       Name2       Id1
Id3       name3       Id1
Id4       name4       Id2
Id5       name5       Id3
我需要编写一个查询,该查询将递归地在表中循环以查找合作伙伴

也就是说,给定一个Id,比如说Id1,我需要提取Id1作为合作伙伴列出的所有名称,所以我的查询需要提取Name3和Name2。随后,在同一个查询中,我还需要提取名称3和名称2也作为合作伙伴列出的名称。因此,在这种情况下,如果我将输入作为Id1提供给SP,我将得到一个如下所示的列表

   Id          Name
  Id2         name2
  Id3         name3
  Id4         name4
  Id5         name5
我还没有用SQL递归地获取数据。有人告诉我可以使用一个通用的表表达式,但我看不出这对我有什么帮助。一天多以来,我一直在为这个问题绞尽脑汁,我能想到的就是使用光标


这方面的任何帮助都有助于

以下内容返回相关但未请求的行:

declare @Gurus as Table ( Id VarChar(4), Name VarChar(16), IdPartner VarChar(4) )
insert into @Gurus ( Id, Name, IdPartner ) values
  ( 'Id1', 'name1', NULL ),
  ( 'Id2', 'Name2', 'Id1' ),
  ( 'Id3', 'Name3', 'Id1' ),
  ( 'Id4', 'Name4', 'Id2' ),
  ( 'Id5', 'Name5', 'Id3' )

declare @TargetId as VarChar(4) = 'Id1'

; with RelatedGurus as (
  -- Anchor: Get the rows that are partners of the target row.
  select Id, Name, IdPartner
    from @Gurus
    where IdPartner = @TargetId
  union all
  -- Recursion: Add any rows that are partners to the rows just added.
  select G.Id, G.Name, G.IdPartner
    from @Gurus as G inner join
      RelatedGurus as RG on RG.Id = G.IdPartner )
  -- Display the result.
  select Id, Name
    from RelatedGurus
    order by Name

下面返回相关但未请求的行:

declare @Gurus as Table ( Id VarChar(4), Name VarChar(16), IdPartner VarChar(4) )
insert into @Gurus ( Id, Name, IdPartner ) values
  ( 'Id1', 'name1', NULL ),
  ( 'Id2', 'Name2', 'Id1' ),
  ( 'Id3', 'Name3', 'Id1' ),
  ( 'Id4', 'Name4', 'Id2' ),
  ( 'Id5', 'Name5', 'Id3' )

declare @TargetId as VarChar(4) = 'Id1'

; with RelatedGurus as (
  -- Anchor: Get the rows that are partners of the target row.
  select Id, Name, IdPartner
    from @Gurus
    where IdPartner = @TargetId
  union all
  -- Recursion: Add any rows that are partners to the rows just added.
  select G.Id, G.Name, G.IdPartner
    from @Gurus as G inner join
      RelatedGurus as RG on RG.Id = G.IdPartner )
  -- Display the result.
  select Id, Name
    from RelatedGurus
    order by Name
请尝试此查询

    IF OBJECT_ID('tempdb..#tmptesttable') IS NOT NULL 
        DROP TABLE #tmptesttable

    DECLARE @ParentID NVARCHAR(50)
    SET @ParentID = 'Id1'

    SELECT 
        *
    INTO
        #tmptesttable
    FROM 

    (
        SELECT 'Id1','name1', NULL UNION ALL          
        SELECT 'Id2','Name2', 'Id1' UNION ALL
        SELECT 'Id3','name3', 'Id1' UNION ALL
        SELECT 'Id4','name4', 'Id2' UNION ALL
        SELECT 'Id5','name5', 'Id3'
    ) testData (Id,Name,IdPartner)

    ;WITH cteHierarchy AS (
        SELECT Id,Name,IdPartner FROM #tmptesttable WHERE Id = @ParentID
        UNION ALL
        SELECT 
            tmptesttable.Id,tmptesttable.Name,tmptesttable.IdPartner 
        FROM 
            #tmptesttable  tmptesttable
        INNER JOIN
            cteHierarchy
        ON
            cteHierarchy.Id = tmptesttable.IdPartner
    )
    SELECT * FROM cteHierarchy WHERE IdPartner IS NOT NULL
请尝试此查询

    IF OBJECT_ID('tempdb..#tmptesttable') IS NOT NULL 
        DROP TABLE #tmptesttable

    DECLARE @ParentID NVARCHAR(50)
    SET @ParentID = 'Id1'

    SELECT 
        *
    INTO
        #tmptesttable
    FROM 

    (
        SELECT 'Id1','name1', NULL UNION ALL          
        SELECT 'Id2','Name2', 'Id1' UNION ALL
        SELECT 'Id3','name3', 'Id1' UNION ALL
        SELECT 'Id4','name4', 'Id2' UNION ALL
        SELECT 'Id5','name5', 'Id3'
    ) testData (Id,Name,IdPartner)

    ;WITH cteHierarchy AS (
        SELECT Id,Name,IdPartner FROM #tmptesttable WHERE Id = @ParentID
        UNION ALL
        SELECT 
            tmptesttable.Id,tmptesttable.Name,tmptesttable.IdPartner 
        FROM 
            #tmptesttable  tmptesttable
        INNER JOIN
            cteHierarchy
        ON
            cteHierarchy.Id = tmptesttable.IdPartner
    )
    SELECT * FROM cteHierarchy WHERE IdPartner IS NOT NULL

我不知道确切的情况,你说的递归是什么意思?你能再解释一下吗?您需要编写一个递归访问数据库的程序。它可以是多个,也就是说Id1可以与Id3、Id4和Id2合作,也可以与Id3和Id4合作。我不完全理解您的意思。但我认为您需要一个非常简单的Select查询。从IdPartner=id1的表中选择*我的意思是,当查询第一次提取id1是伙伴的记录时,它需要递归地查看结果集中是否有ID是其他记录的伙伴。这里举个例子,当我将Id1传递给SP时,我第一次拉起Id2和Id3,SP现在必须递归地出现在表中,其中Id2是一个伙伴,Id3是一个伙伴,然后查看该结果集,直到没有其他伙伴。现在我得到了它。让我再想想。我不知道确切的情况,你说的递归是什么意思?你能再解释一下吗?您需要编写一个递归访问数据库的程序。它可以是多个,也就是说Id1可以与Id3、Id4和Id2合作,也可以与Id3和Id4合作。我不完全理解您的意思。但我认为您需要一个非常简单的Select查询。从IdPartner=id1的表中选择*我的意思是,当查询第一次提取id1是伙伴的记录时,它需要递归地查看结果集中是否有ID是其他记录的伙伴。这里举个例子,当我将Id1传递给SP时,我第一次拉起Id2和Id3,SP现在必须递归地出现在表中,其中Id2是一个伙伴,Id3是一个伙伴,然后查看该结果集,直到没有其他伙伴。现在我得到了它。让我再想想。