我可以在T-SQL数据库中进行递归SELECT

时间:2012-02-26 22:58:46

标签: sql sql-server sql-server-2008 tsql recursion

我不确定SQL Server的数据库中是否可以这样做?

说,我有一张桌子:

id INT
nm NVARCHAR(256)
cid INT --references [id]

和假设数据:

id   nm       cid
1    Name 1   0
2    Name 2   0
3    Name 3   1
4    Name 4   3
5    Name 5   2
6    Name 6   4
7    Name 7   2

选择的逻辑如下:

  1. 说,我们有原始ID,我们称之为N。

  2. 然后我们有一个查找ID,我们称之为X.然后我们这样做:

    SELECT [cid] FROM [TableName] WHERE [id]=X
    
  3. 并检查结果是否等于N.如果是,则返回该记录的[nm]。如果结果为0,那么我们返回Null。如果结果是别的我们做同样的选择,除了X现在是结果值。

    我显然可以用C#做​​到这一点,但我很好奇是否有可能在纯SQL语句中结束?

    PS。为了用上面的表格来说明这一点,如果N是1而X是6,那么我们得到:

    SELECT [cid] FROM [TableName] WHERE [id]=6    --results is 4 (not N or 0, then continue)
    SELECT [cid] FROM [TableName] WHERE [id]=4    --results is 3 (not N or 0, then continue)
    SELECT [cid] FROM [TableName] WHERE [id]=3    --results is 1 (is N, then return "Name 1")
    

    或如果N为1且X为7,我们得到:

    SELECT [cid] FROM [TableName] WHERE [id]=7    --results is 2 (not N or 0, then continue)
    SELECT [cid] FROM [TableName] WHERE [id]=2    --results is 0 (is 0, then return Null)
    

    修改 我需要在SQL Server 2008下运行。

1 个答案:

答案 0 :(得分:15)

递归CTE可以做到这一点。它看起来像这样:

WITH q AS (
    SELECT t.id, t.name, t.cid
    FROM t
    WHERE t.id = @x
    UNION ALL
    SELECT t.id, t.name, t.cid
    FROM q
    INNER JOIN t
    ON t.id = q.cid
)
SELECT name
FROM q
WHERE id = @n

这个想法是CTE可以在UNION ALL子句的第二部分中引用自身,并且它将评估第二部分,直到它不再生成结果或达到内部限制。