工作上突然有一個遞迴的需求

需求並不複雜, 用程式就能簡簡單單的寫完

但是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';

 

創作者介紹
創作者 伊 的頭像

伊のspace~芳香精油*美容保養*程式設計

伊 發表在 痞客邦 留言(0) 人氣()