我有如下的表格
file_table
file_table
f_id file_name
21 abc.xml
13 xyz.xml
folder_table
f_id f_name
15 Main
21 Sub
13 Sub2
group_table
parent child
21 13
1521
在file_table中,file_name "xyz.xml",其對應的f_id是13(sub2),基于這個f_id,我想從group_table中檢查其父節點,即21(sub)。然后從group_table中的前一個父節點,即15(Main)等,檢查是否有對應的父節點。最后檢查這個父節點是否存在于child中,如果不存在,就是根節點。13 -> 21 -> 15
我想寫一個查詢來選擇資料,如下所示。
f_name file_name
Main/Sub/Sub2 xyz.xml
Main/Sub abc.xml
uj5u.com熱心網友回復:
你可以在你的查詢中使用一個遞回的普通表運算式(CTE)來獲取一個檔案路徑中的所有目錄。在你的主查詢中,你可以(ab)使用SELECT ... FOR XML子查詢,將所有這些目錄連接成一個完整的路徑。
WITH CTE (f_id, depth, f_id_depth) AS (
--Anchor陳述句。
--(這提供了CTE的起始結果集。)。
SELECT DISTINCT
f_id。
1,
編碼
FROM[/span
檔案表
UNIONALL
--遞回陳述句。
--(注意這句話在FROM陳述句中包含了CTE本身。)。
--(這個陳述句被反復執行,直到它不再回傳任何行。)
--(每一次,它的結果都被添加到CTE的結果集中。
SELECT
CTE.f_id,
CTE.depth 1,
F.f_id
FROM[/span].
CTE
INNER JOIN group_table AS G ON G.child = CTE.f_id_depth
INNER JOIN folder_table AS F ON F.f_id = G.father
)
SELECT>
--使用SELECT ... FOR XML子查詢將檔案夾名稱(每個都以斜線為前綴)連接到一個字串中。
--另外,用STUFF函式包住子查詢,以去除前面的斜線。
STUFF((SELECT '/'/span> FF.f_name
FROM CTE INNER JOIN folder_table AS FF ON FF. f_id = CTE.f_id_depth
WHERE CTE.f_id = F.f_id
ORDER BY CTE.depth DESC
FOR XML PATH('')), 1, 1, ') AS f_name。
F.file_name
FROM
file_table AS F。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/314817.html
標籤:
上一篇:輸入選定的行并忽略重復的行
