Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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/0/amazon-s3/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 需要有关SQLServer2005中递归的帮助吗_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 需要有关SQLServer2005中递归的帮助吗

Sql server 需要有关SQLServer2005中递归的帮助吗,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我在表中表示一棵树,我需要能够获取特定元素的根节点(TOP ID)。根节点始终具有ParentID的null。例如,如果该表如下所示: ID ParentID 1 null 2 null 3 null 4 2 5 1 6 2 7 6 8 4 9 8 10 6 当ID=10时,顶部ID=2;当ID=9时,顶部ID=3;等等是否可以编写一个SQL server函数,在给定ID时返回TOP ID?MSDN有一组非常好的用于编写递归查询的示例。在SQLServ

我在表中表示一棵树,我需要能够获取特定元素的根节点(
TOP ID
)。根节点始终具有
ParentID
null
。例如,如果该表如下所示:

ID   ParentID
1   null
2   null
3   null
4   2
5   1
6   2
7   6
8   4
9   8
10  6

ID=10
时,
顶部ID=2
;当
ID=9
时,
顶部ID=3
;等等是否可以编写一个SQL server函数,在给定
ID
时返回
TOP ID

MSDN有一组非常好的用于编写递归查询的示例。在SQLServer2005之前执行这些操作是一件非常痛苦的事情(现在在旧的Server2000应用程序中处理这个问题).

MSDN的出现,很可能会比我们在这一场景中所允许的格式更好地解释它。

下面是一个存储过程的递归示例,它将为给定的存储过程ID-(@ID)找到父级(父级ID=null)。这就是你要找的吗

    WITH recurseUp (ID, ParentID)
    AS
    (
        SELECT ID, ParentID
        FROM myTable
        WHERE ID = @ID 
        UNION ALL
        SELECT b.ID, b.ParentID
        FROM recurseUp a JOIN myTable b 
        ON (a.ParentID = b.ID)
    )
SELECT ID FROM recurseUP WHERE ParentID is null

这是可能的,但我知道的唯一方法是使用游标和递归存储过程。从性能的角度来看,这是一种非常糟糕的方法(通常)。如果可能的话,你可能想考虑拥有一个额外的根父节点的成本,当你移动时,通过代码保持更新。p> SQL 2003(即SQL Server 2000)之前的SQL中的递归有点难看;对于树中的每个级别,您都需要将一个单独的join语句写回到原始表中。如果层次结构中的级别数是固定的,您可以编写类似的内容

WITH    q AS
        (
        SELECT  id, parentID
        FROM    mytable
        WHERE   id = 10
        UNION ALL
        SELECT  mytable.id, mytable.parentid
        FROM    q
        JOIN    mytable
        ON      mytable.parentId = q.id
        )
SELECT  *
FROM    q
WHERE   parentID IS NULL
create table #Hell (
parent int,
id int,
name varchar(30)
)

insert into #Hell values (NULL, 1, 'The Boss')
insert into #Hell values (1, 2, 'The Boss'' PA')
insert into #Hell values (1, 3, 'Production Director')
insert into #Hell values (3, 4, 'Jim''l Fixit')


select * from #Hell H1
inner join #Hell H2
ON H1.id=H2.parent
inner join #Hell H3
ON H2.id=H3.parent
WHERE H3.Id=4  --Find the boss for Jim

drop table #Hell
幸运的是,SQLServer2005有一个带有公共表表达式的,可以非常轻松地编写递归操作。见


您还应该了解在数据库中表示树的各种方法。请看一下本演示文稿中SQL树上的幻灯片

CTE现在在server 2005及以后的版本中使该过程变得更加简单。事实上,它是一个用于Sever 2000的P.I.T.a.“with”操作符实际上被称为“Common Table Expression”(CTE),它不是SQL Server特定的扩展,但它是SQL:2003标准的一部分。出于某种原因,我认为它是Microsoft的东西,但环顾一下Postgres,它也支持使用递归的CTE。这个例子很好,但如何将所有这些东西放到视图或sql函数中,这是不可能的吗?