Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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 需要SQL server中特定父记录的整个子记录链_Sql Server_Database_Parent Child - Fatal编程技术网

Sql server 需要SQL server中特定父记录的整个子记录链

Sql server 需要SQL server中特定父记录的整个子记录链,sql-server,database,parent-child,Sql Server,Database,Parent Child,我们希望根据SQL Server的ID获取特定记录的总树结构(下链) 这是我的数据表结构: ----------------------------------------------------------------- CHILD_CODE PARENT_CODE CHILD_RANK PARENT_RANK ----------------------------------------------------------------- 1

我们希望根据SQL Server的ID获取特定记录的总树结构(下链)

这是我的数据表结构:

-----------------------------------------------------------------
CHILD_CODE      PARENT_CODE      CHILD_RANK      PARENT_RANK
-----------------------------------------------------------------
1               Null                  1          Null
2               1                     2          1
3               1                     2          1
4               1                     2          1
5               2                     3          2
6               2                     3          2
7               3                     3          2
8               5                     4          3
在这里,我需要有一个家长的整个子树。也就是说,如果我给2作为父输入,它将给我它下面的所有子元素作为一棵树,直到最后。 例子。。。一,

输入>父项代码=2

输出>

----------------------------------------------
PARENT_CODE     CHILD_CODE      CHILD_RANK
----------------------------------------------
2               5               3
2               6               3
2               8               4
----------------------------------------------
在这里,我们使用了CET

; WITH rekurs AS (
   SELECT child_code, child_rank
   FROM   tbl
   WHERE  parent_code = 2
   UNION ALL
   SELECT ch.child_code, ch.child_rank
   FROM   tbl ch
   JOIN   rekurs r ON ch.parent_code = r.child_code
)
SELECT 2 AS PARENT_CODE, child_code, child_rank
FROM  CTE
我们已经添加了这个CTE输入输出程序,但是在这里我们正在处理大量的记录,我们面临一些问题。在这个CTE中,我们传递的是一个
父代码
,我们将获得该特定代码的所有子代码


在这里,我们想要得到30000个父代码的所有子代码,当我们在C程序的for循环中将
父代码
一个接一个地传递给CTE时,需要花费很多时间。有没有办法解决这个问题?

您可以使用以下代码

假设您的表名为
data
,则:

declare @input int =2
;with report as(
   select ChildCode,ParentCode,ChildRank,ParentRank
   from data
   where ParentCode = @input
   union all
   select d.ChildCode,d.ParentCode,d.ChildRank,d.ParentRank
   from data d
   inner join report r on d.ParentCode = r.ChildCode
 )

 select * from report 
这是一张工作票

结果

ChildCode   ParentCode  ChildRank   ParentRank
5   2   3   2
6   2   3   2
8   5   4   3
根据下面的评论编辑

解释

  • 可以创建用户定义的表类型

    将类型ParentInputs创建为表(ParentCode int)

  • 将表类型参数传递给查询

  • 查询

    ;with report as(
       select ChildCode,d.ParentCode,ChildRank,ParentRank
       from @data d
       inner join @input p on d.ParentCode = p.ParentCode
       union all
       select d.ChildCode,d.ParentCode,d.ChildRank,d.ParentRank
       from @data d
       inner join report r on d.ParentCode = r.ChildCode
     )
     select * from report order by ParentCode
    
    为了演示,我创建了一个参数表,而不是表类型,请查找工作表

    父代码的结果(2,3)


    希望这将对您有所帮助

    以下内容是否适用于您:

    ; WITH rekurs AS (
       SELECT parent_code Root_code, child_code, child_rank
       FROM   RecursiveTable
       WHERE  parent_code IN (1, 2, 3)
       UNION ALL
       SELECT r.Root_code, ch.child_code, ch.child_Rank
       FROM   RecursiveTable ch
       JOIN   rekurs r ON ch.parent_code = r.child_code
    )
    SELECT Root_code, child_code, child_Rank
    FROM   rekurs
    ORDER BY Root_code
    
    这是结果集:

    Root_code child_code child_Rank
    1         2          2
    1         3          2
    1         4          2
    1         7          3
    1         5          3
    1         6          3
    1         8          4
    2         5          3
    2         6          3
    2         8          4
    3         7          3
    

    为什么不使用表变量而不是逐个调用来传递ID呢?建议的解决方案是好的。这也证明了以父子关系的方式存储百万行是不好的,因为对百万条记录的递归查询确实是不好的。对于工作解决方案+1,但分号位于前一行的末尾,不是在
    前面的行的开头,用
    @AshleyPillay表示分号,从技术上讲,你是对的,但通常的做法是将其添加到with前面,以确保不要忘记,因为在特定单词之前必须有一个尾随分号,虽然大多数其他人不需要这样做,但这是一种常见做法,因为大多数人不理解SQL Server发出的错误消息,即在
    with
    之前使用分号,因此他们只是在不理解它是ANSI SQL规范中的语句终止符的情况下使用分号。我们应该尝试遵循ANSI规范并习惯于使用它用分号终止所有SQL语句。(咆哮:)@Monah,我认为你的答案只是添加了一个参数,但没有帮助他们解决问题,因为每个问题都有许多家长,在
    中使用
    将不适用于这个问题,特别是有30000个家长,
    中的
    可以用于限制值2100 max,我认为,因此查询将给他一个错误,还将值传递给SQL,它将作为字符串,因此这里有另一个性能problem@Monah是的,你完全正确,我的目的只是向他展示如何在每次通话中获得多棵树;可以肯定地将IN更改为联接或其他任何内容
    
    Root_code child_code child_Rank
    1         2          2
    1         3          2
    1         4          2
    1         7          3
    1         5          3
    1         6          3
    1         8          4
    2         5          3
    2         6          3
    2         8          4
    3         7          3