私は SQL Server 2014 で作業しています。奇妙なデータ階層の状況があります。(少なくとも、私は以前にそのようなことを経験したことがありません。)
私の階層には、いくつかのルート/最上位オブジェクトがあります。ルート レベルより下のすべてのオブジェクトは、その上の 1 つのオブジェクトだけにマップされます。すべてのノード パスが同じ長さではありません。たとえば、あるパスには 2 つのオブジェクト レベルがあり、別のパスには 20 のオブジェクト レベルがある場合があります。
階層内のすべてのオブジェクトには、IsInherited
属性とその他の属性 ( と呼びますSomeAttribute
) があります。この属性は、指定されたオブジェクトが最も近い親からIsInherited
の値を継承するかどうかを示します。SomeAttribute
当然のことながら、オブジェクトのIsInherited
属性が「Y」の場合、指定されたオブジェクトは最も直接のSomeAttribute
親から値を継承します (さらに、最も直接の親の値を継承することもできます)。それ以外の場合は、オブジェクトのSomeAttribute
値が指定されます。
さて、上記のすべてが必ずしも珍しいわけではありません。この状況を珍しいものにしているのは、この継承の特定の実装です。この階層は単一のテーブルに格納され (これは隣接リスト モデルになりますか?)、属性が「Y」の場合、指定されたオブジェクト/行の値SomeAttribute
は入力されません。IsInherited
SomeAttribute
私の目標は、階層内のすべてのオブジェクトの値を返すことです。
テーブルのサンプルは次のとおりです。
CREATE TABLE hierarchy (
ID int NOT NULL
,ParentID int NULL
,SomeAttribute char(1) NULL
,IsInherited char(1) NOT NULL
)
;
INSERT INTO hierarchy (ID, ParentID, SomeAttribute, IsInherited)
VALUES
(1, NULL, 'a', 'N')
,(2, NULL, 'b', 'N')
,(3, NULL, 'c', 'N')
,(4, NULL, 'd', 'N')
,(5, NULL, 'e', 'N')
,(6, NULL, 'f', 'N')
,(7, NULL, 'g', 'N')
,(8, 2, NULL, 'Y')
,(9, 3, 'h', 'N')
,(10, 4, NULL, 'Y')
,(11, 5, 'j', 'N')
,(12, 6, NULL, 'Y')
,(13, 6, 'k', 'N')
,(14, 7, 'l', 'N')
,(15, 7, 'm', 'N')
,(16, 10, NULL, 'Y')
,(17, 11, NULL, 'Y')
,(18, 16, NULL, 'Y')
,(19, 17, NULL, 'Y')
,(20, 19, 'o', 'N')
;
これにより、次のノード パスが得られます。
1
2-8
3-9
4-10-16-18
5-11-17-19-20
6-12,13
7-14,15
したがって、このサンプル テーブルでは、次の結果が返されると予想されます。
ID SomeAttribute
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 b (inherited from 2)
9 h
10 d (inherited from 4)
11 j
12 f (inherited from 6)
13 k
14 l
15 m
16 d (inherited from 10, inherited from 4)
17 j (inherited from 11)
18 d (inherited from 16, inherited from 10, inherited from 4)
19 j (inherited from 17, inherited from 11)
20 o
これにはおそらく再帰的な CTE が必要であることを知っています。このためのSQLを書くのに苦労しています。必要な出力を返すにはどうすればよいですか?