【发布时间】:2014-03-26 04:09:54
【问题描述】:
我有下表:
CREATE TABLE routes
(
ID int identity not null primary key,
from int,
to int,
length int not null
)
我需要从指定的ID1 到ID2 的所有路由。
我听说过WITH 子句,但我一点也不满意。它不允许轻松搜索从ID1 到ID2 的方式,因为它只返回一个包含FROM 和TO 值的表,并且很难搜索所有可能的方式。
我需要递归内连接之类的东西 - 例如:
SELECT *
FROM routes r1
INNER JOIN routes r2 ON (r1.to = r2.from AND r2.to <> r1.from AND r1.from = ID1)
它让我寻找由 2 条路线组成的所有方式,从 ID1 开始,但不是那些去某个地方然后回到 ID1 的路线。现在我可以选择以 ID2 结尾的所有路由(可能为 NULL,但可能会出现某些东西)。如果有一条或多条路线在 ID2 结束,我想中断,如果没有,我想与路线 r3 内连接并重复过程,直到找到一条路线。
我可以在过程和 IF 子句中做到这一点,但我认为必须有更好的解决方案。
正如我所说,WITH 子句不能让我满意,因为它不能让我轻松找到所有路线,只有一条。
【问题讨论】:
-
你需要一个递归语句,递归 CTE 就是你所需要的。
-
...我们假设 SQL Server 有点风格?
-
SQL Server,我更正了描述。如我所见,递归 CTE 使用 WITH 子句并在单行中返回所有路由,因此无法轻松选择在指定 ID2 上完成的所有方式
-
正如 Gordon 提到的,递归 CTE 应该是要走的路。最近写了一个HERE-post link,想参考一下入手。
-
递归 CTE 可能很棘手,所以我承认您可能不会“轻易”找到它们,但它们可以处理分支,并且可能会更优雅地处理其他循环递归过程。我们可以假设沿路线的步数有特定限制吗? 5? 10? 100? 1000?
标签: sql sql-server recursion inner-join