2011-11-17 118 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

相關問題