2011-11-17 108 views
3

我想写一个SQL查询(用于SQl服务器),并且好奇是否有一个简单的方法来实现我的目标。我会简化一些事情来处理问题的核心:递归SQL查询:一个条目到另一个条件,并遍历它

我有一个包含两列的表,我们可以调用列A和列B.列A包含分段文件的名称,列B包含分段文件的下一部分。所以,我可以有多个分段指向多个分段。

因此,举例来说:

Column A  Column B 
File 1  File 2 
File 2  File 3 
File 3  File 4 
File 7  File 13 

我需要开始文件1和一个列有文件4的结局,最好是所有段的清单。或者换一种说法,我需要从列A中的给定条目开始,并且具有来自列B的遍历和取消引用条目,直到列A中的列B没有找到条目。

类似于SELECT allsegments()从FTable WHERE FTable.A =“文件1”?或者你认为我需要编写一些自定义代码?

+0

你的例子应该输出什么?我不清楚什么条件连接列A和B。 – Tomalak

+0

输出应该是带有以下条目的单个列(假设我为它提供文件1) - >文件1,文件2,文件3,文件4。来自文件4,因为在列A中找不到文件4的条目。 – user978122

回答

2

使用递归CTE它可以是这个样子:

declare @T table 
(
    ColumnA varchar(10), 
    ColumnB varchar(10) 
); 

insert into @T values 
('File 1',  'File 2'), 
('File 2',  'File 3'), 
('File 3',  'File 4'), 
('File 7',  'File 13'); 

with C as 
(
    select T.ColumnA, 
     T.ColumnB, 
     cast(T.ColumnA+','+T.ColumnB as varchar(max)) as Comb 
    from @T as T 
    where T.ColumnA = 'File 1' 
    union all 
    select T.ColumnA, 
     T.ColumnB, 
     C.Comb+','+T.ColumnB 
    from @T as T 
    inner join C 
     on T.ColumnA = C.ColumnB 
) 
select top 1 Comb 
from C 
order by len(Comb) desc 
option (maxrecursion 0) 

结果:

Comb 
------------------------ 
File 1,File 2,File 3,File 4 

默认maxrecursion是100,所以如果你有一个链条超过100个文件,你需要指定允许的递归次数。 option (maxrecursion 0)使最大数量无限制。

+0

有趣。只是为了我自己的信息,你觉得这个查询有多贵?如你所说,以另一种方式构建我的表,或者在几千条记录上运行这个查询不是一个担心,你认为这会更明智吗? – user978122

+0

@ user978122我认为表现会很好。你需要在'ColummnA'上有一个索引。使用'ColumnB'或者'ColumnA'的索引作为聚簇来避免表扫描。 –

0
select path from 
(
    select connect_by_isleaf leaf, sys_connect_by_path(von, '/') path 
    from table1 
    start with A = 'File x' 
    connect by A = prior B 
) where path like '%File y'; 

=>该查询返回从文件X的可能路径文件y,通过/或任何 定界符你选择的分隔。

+0

您没有读取SQL Server标记。 – Tomalak

相关问题