|
■No89895 (ルパン さん) に返信 > DECLARE @PNAME VARCHAR(20) = 'A'; どのデータベース製品のどのバージョンを 用いているのかも示した方が良いですよ。
> 以下のような感じでデータがある場合に 元データには 'C' - 'F' のノードもあるのですよね? 条件から漏れているので抽出されないというだけで。
> また、とってきたデータが以下の順番でとってこれますか? あまり検証してないですが、これでどうかな…。 とりあえず、手元にあった SQL Server 2008 R2 で組んでみました。
CREATE TABLE M_TREE ( PNAME VARCHAR(20) NOT NULL , CNAME VARCHAR(20) NOT NULL , CONSTRAINT PX_M_TREE PRIMARY KEY (PNAME, CNAME) );
INSERT INTO M_TREE VALUES ('A', 'B'), ('A', 'E'), ('B', 'E'), ('C', 'F'), ('E', 'G'), ('E', 'H');
DECLARE @PNAME VARCHAR(20) = 'A'; DECLARE @SEPARATOR CHAR(1) = '/';
WITH CTE (PNAME, CNAME, DEPTH, PATH) AS ( SELECT PNAME, CNAME, 1, CAST(PNAME + @SEPARATOR + CNAME AS VARCHAR(MAX)) FROM M_TREE WHERE PNAME = @PNAME UNION ALL SELECT T2.PNAME, T2.CNAME, CTE.DEPTH + 1, CTE.PATH + @SEPARATOR + T2.CNAME FROM M_TREE AS T2 INNER JOIN CTE ON CTE.CNAME = T2.PNAME ) SELECT * FROM CTE ORDER BY PATH;
|