SQL Serverで階層問合せ
レコードに自身のコードと親コードを持ち、親子関係よりツリー構造を抽出するものをOracleでは階層問合せといい、START WITH句、CONNECT BY句を使用して抽出できますが、SQL ServerにはSTART WITH句、CONNECT BY句が使用できません。
そこでSQL Serverで階層問合せをするSQLを紹介します。
コーディング例
BEGIN -- 一時テーブル作成 CREATE TABLE #所属( 所属コード VARCHAR(3) ,所属名 VARCHAR(10) ,親所属コード VARCHAR(3) ); -- 一時テーブルへデータ追加 INSERT INTO #所属 VALUES ('100','A会社','') ,('200','B部','100') ,('300','C課','200') ,('400','D部','100') ,('500','E課','400') ; -- 階層問合せ WITH TBL AS ( SELECT T1.所属コード ,T1.所属名 ,CAST(T1.所属コード AS VARCHAR(100)) AS 所属コードリスト ,CAST(T1.所属名 AS VARCHAR(100)) AS 所属名リスト FROM #所属 T1 WHERE T1.所属コード = '100' UNION ALL SELECT T2.所属コード ,T2.所属名 ,CAST(TBL.所属コードリスト + ' > ' + T2.所属コード AS VARCHAR(100)) ,CAST(TBL.所属名リスト + ' > ' + T2.所属名 AS VARCHAR(100)) FROM #所属 T2 INNER JOIN TBL ON T2.親所属コード = TBL.所属コード ) SELECT 所属コードリスト ,所属名リスト FROM TBL ORDER BY 所属コードリスト ; -- 一時テーブルの削除 DROP TABLE #所属; END
実行結果
所属コードリスト | 所属名リスト |
---|---|
100 | A会社 |
100 > 200 | A会社 > B部 |
100 > 200 > 300 | A会社 > B部 > C課 |
100 > 400 | A会社 > D部 |
100 > 400 > 500 | A会社 > D部 > E課 |
WITH句内でUNION ALLを使用すると自身の結果を参照することが可能になります。
以上、「SQL Serverで階層問合せ」でした。