工作上突然有一個遞迴的需求
需求並不複雜, 用程式就能簡簡單單的寫完
但是SQL語法非常不熟練的我, 突然想說 來練練SQL語法好了 (加上懶得再改程式...)
所以就來研究了一下SQL的遞迴寫法
<範例>
有一個資料表: [員工資料表]
欄位很簡單: [主管], [員工]
[主管]欄位是NULL的[員工], 代表沒有人管他, 就是大主管的意思
需求是: 當輸入一個員工姓名, 要把該員工下面所有階層的員工都Show出來
SQL語法:
WITH [員工資料表new] AS (
--找出 [主管] 為 某人 或 NULL 的資料當作 依據
SELECT [主管], [員工]
FROM [員工資料表]
WHERE [主管] = '郭董' --NULL
UNION ALL
--然後,用 上面查出的結果 為依據 遞迴查詢
SELECT e.[主管], e.[員工]
FROM [員工資料表] e
INNER JOIN [員工資料表new] ecte ON ecte.[員工] = e.[主管]
)
SELECT *
FROM [員工資料表new]
實際上工作的需求:
輸入一成品ID, 帶出該產品所需使用的全部材料.
因為材料本身也可能是成品(Type=A或F), 那就要針對是成品的材料再遞迴找出它的材料是什麼, 依此遞迴下去..
DECLARE @APART nvarchar(20) = 'ABC1234567890'
;WITH [MY_BOM] AS (
SELECT b.[APart]
, b.[Part]
, p.[Type]
FROM [BOM] b
INNER JOIN [Material] p ON b.[Part] = p.[Part]
WHERE b.[APart]=@APART
UNION ALL
SELECT bom.[APart]
, bom.[Part]
, part.[Type]
FROM [BOM] bom
INNER JOIN [Material] part ON bom.[Part] = part.[Part]
INNER JOIN [MY_BOM] ecte ON ecte.[Part] = bom.[APart] AND (ecte.[Type]='A' OR ecte.[Type]='F')
)
SELECT * FROM [MY_BOM] WHERE [Type]!='A' AND [Type]!='F';
留言列表