|
■No92228 (犬夜叉 さん) に返信
> 例@のやり方では計算上WITH で作成されるデータは5000億個を超えるので、
> 最後に DISTINCT するのではなく途中で 重複データを消しながらデータを
> 作成していく方法はないのでしょうか?
階層化の際に [NO] 列は使っていないようなので、
OYA, KO だけで階層問い合わせして、最後に [NO] を逆引きできないでしょうか。
/*
CREATE TABLE TBL ( OYA CHAR(1), KO CHAR(1), [NO] int );
INSERT INTO TBL VALUES
('A', 'B', 1), ('A', 'B', 2)
, ('B', 'C', 1), ('B', 'C', 2)
, ('C', 'D', 1), ('C', 'D', 2)
, ('D', 'E', 1), ('D', 'E', 2)
, ('E', 'F', 1), ('E', 'F', 2)
, ('F', 'G', 1), ('F', 'G', 2)
, ('G', 'H', 1), ('G', 'H', 2)
, ('H', 'I', 1), ('H', 'I', 2)
, ('I', 'J', 1), ('I', 'J', 2)
, ('J', 'K', 1), ('J', 'K', 2)
, ('K', 'L', 1), ('K', 'L', 2)
, ('L', 'M', 1), ('L', 'M', 2)
, ('M', 'N', 1), ('M', 'N', 2)
, ('N', 'O', 1), ('N', 'O', 2)
, ('O', 'P', 1), ('O', 'P', 2)
, ('P', 'Q', 1), ('P', 'Q', 2)
, ('Q', 'R', 1), ('Q', 'R', 2)
, ('R', 'S', 1), ('R', 'S', 2)
, ('S', 'T', 1), ('S', 'T', 2)
, ('T', 'U', 1), ('T', 'U', 2)
, ('U', 'V', 1), ('U', 'V', 2)
, ('V', 'W', 1), ('V', 'W', 2)
, ('W', 'X', 1), ('W', 'X', 2)
, ('X', 'Y', 1), ('X', 'Y', 2)
, ('Y', 'Z', 1), ('Y', 'Z', 2)
;
*/
WITH CTE1 AS
(
SELECT DISTINCT OYA, KO
FROM TBL
), CTE2 AS (
SELECT DISTINCT OYA, KO
FROM CTE1
WHERE OYA = @OYA
UNION ALL
SELECT spi2.OYA, spi2.KO
FROM CTE1 AS spi2 INNER JOIN CTE2 ON spi2.OYA = CTE2.KO
)
SELECT * FROM TBL WHERE EXISTS(SELECT * FROM CTE2
WHERE TBL.OYA = CTE2.OYA AND TBL.KO = CTE2.KO)
|