sql - 我可以在 T-SQL 数据库中进行递归选择吗

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

我不确定在 SQL Server 的数据库中是否可行?

说,我有一张 table :

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

选择的逻辑应该如下:
  • 比如说,我们有原来的 id,我们就叫它 N。
  • 然后我们有一个查找 id,我们称之为 X。然后我们做:
    SELECT [cid] FROM [TableName] WHERE [id]=X
    

  • 并检查结果是否等于 N。如果是,则我们为该记录返回 [nm]。如果结果为 0,则返回 Null。如果结果是别的东西,我们做同样的选择,除了 X 现在是结果值。

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

    附注。只是为了用我上面的表格来说明这一点,如果 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 下运行。

    最佳答案

    递归 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 的第二部分中引用它自己。子句,它将评估第二部分,直到不再产生结果,或者达到内部限制。

    关于sql - 我可以在 T-SQL 数据库中进行递归选择吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9458096/

    相关文章:

    mysql - 根据 x 和 y 列检查 SQL 数据库中附近对象的最佳方法

    SQL Developer ISA 层次结构到关系模型

    python - 找不到 SQL 服务器

    sql - 函数在 sql server 上的 CHECK 约束中不起作用

    sql - 显示与另一个表 sql server 不匹配的空值

    sql-server - SQL CONSTRAINT 不同的名称

    java - ResultSet getObject(int, class) 与反射

    tsql - T-SQL 确定历史表中的状态变化

    sql-server-2008 - SQL Server 代理为 CmdExec 添加参数

    sql-server - .NET : How to insert XML document into SQL Server