我有一张包含以下数据的表格:
Source | Destination
-------------------
46 47
47 49
48 49
49 50
我想编写一个返回路径列表的sql 即对于46,50作为输入查询应返回46,47,49,50作为输出。
答案 0 :(得分:3)
在SQL Server中,您可以使用递归的公用表表达式(CTE),如下所示:
declare @table Table(child int, parent int)
insert into @table(child, parent)
Values
(46, 47),
(47, 49),
(48, 49),
(49, 50)
declare @start int
set @start = 46
;
with t1(child, parent) as (
select child, parent from @table t2
where child = @start
union all
select t.child,t.parent
from @table as t
join t1 on t1.parent = t.child
)
select parent from t1
union
select child from @table
where child = @start
以下是上述查询的结果:
(4 row(s) affected)
parent
-----------
46
47
49
50
(4 row(s) affected)
答案 1 :(得分:0)
这是一个WHILE LOOP(PSEUDO / UNTESTED);您也可以尝试递归CTE。
--INPUT VARS
@path_begin int
@path_end int
--FUNCTION OR PROC
DECLRE @source int
DECLRE @destination int
DECLRE @path varchar(max)
SET @path = 'No Path Exists'
SELECT @source = source FROM table WHERE source = @path_begin
SELECT @destination = destination FROM table WHERE destination = @path_end
IF @source is not null AND @destination is not null
BEGIN
SET @path = @source
WHILE @source < @destination
BEGIN
SELECT @source = min(source) FROM table WHERE source > @source AND @source < destination
SET @path = @path + ',' + @source
END
SET @path = @source + ',' + @destination
END
RETURN @path
答案 2 :(得分:0)
Derek Greer上面关于使用公用表表达式的解决方案由于多种原因而不正确。两个简单的是:
以下来自tamago的解决方案也不起作用。尝试一些简单的案例,包括你在问题中要求的(46,50)例子,你会发现它不起作用。
答案是,这是计算机科学中的一个经典问题,称为旅行商问题。您可以在维基百科上http://en.wikipedia.org/wiki/Travelling_salesman_problem了解更多相关信息。
此主题已经发布了许多算法。最容易实现的是搜索所有可能的排列,但由于存在大量可能性,这仅适用于小数据集。更高级的算法需要更长的时间来实现,但可以在更大的数据集上工作。
您还可以考虑搜索近似解决方案。有些近似算法适用于更大的数据集,虽然它们会返回有效路径,但它们可能找不到最短的数据。