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

Posted

技术标签:

【中文标题】我可以在 T-SQL 数据库中执行递归 SELECT【英文标题】:Can I do recursive SELECT in T-SQL database 【发布时间】:2012-03-16 12:24:57 【问题描述】:

我不确定在 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

并且选择的逻辑应该如下:

    说,我们有原来的id,就叫N吧。

    然后我们有一个查找 id,我们称它为 X。然后我们这样做:

    SELECT [cid] FROM [TableName] WHERE [id]=X
    

并检查结果是否等于 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 下运行。

【问题讨论】:

您的 DBMS 是什么? SQL Server、Oracle 还是其他? SQL Server 的哪个版本?这可以通过递归 CTE(公用表表达式)实现,但我不知道它们是否适用于您的版本。 @hvd 我使用的是 SQL Server 2008 【参考方案1】:

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

【讨论】:

非常好。我需要尝试一下。谢谢。

以上是关于我可以在 T-SQL 数据库中执行递归 SELECT的主要内容,如果未能解决你的问题,请参考以下文章

我可以执行 T-SQL 查询来确定 SQL Server Express 实例的最大数据大小吗?

仅当表不为空时,T-SQL 才连接表

父子的 T-SQL 递归组

如何在T-SQL中使用递归CTE获得完整的层次结构?

T-SQL 递归

T-Sql 递归查询(给定节点查所有父节点所有子节点的方法)