我不确定在 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
选择的逻辑应该如下:
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/