Вопрос: Помогите составить рекурсивный запрос
Коллеги, помогите составить рекурсивный запрос.
Про рекурсивные CTE, конечно, читал, но составить запрос не могу. Просто не умею мыслить такими категориями.
Нужен пример и всё такое.
Есть таблица:
CREATE TABLE parent_child (
[N] [int] IDENTITY(1,1) NOT NULL,
[parent_id] [varchar](10) NOT NULL,
[parent_rng] [int] NOT NULL,
[child_id] [varchar](10) NOT NULL,
[child_rng] [int] NOT NULL,
PRIMARY KEY CLUSTERED
(
[parent_id] ASC,
[child_id] ASC,
[N] ASC
))
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('_1Z00JIJI2',0,'_1Z00JIJI2',0)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('_1Z00JIJI2',0,'_1Z00JIJI2',1)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('_1Z00JIJI2',1,'B1YD13B28O',0)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('B1YD13B28O',0,'B1YD13BVHE',0)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('C2780K704W',0,'C1YD128OPG',0)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('C2780K704W',0,'C1YD12IK1E',0)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('C2780K704W',0,'C2780K704W',0)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('E33W0L3XYY',0,'E1YD12P8FU',0)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('E33W0L3XYY',0,'E1YD12WA3I',0)
INSERT INTO [parent_child]([parent_id],[parent_rng],[child_id],[child_rng]) VALUES('E33W0L3XYY',0,'E1YD1312WY',0)
Пара [parent_id],[parent_rng] и [child_id],[child_rng] - это идентификаторы узлов дерева.
Корни деревьев (их множество) это узлы, в которых [parent_id]=[child_id] and [parent_rng]=[child_rng], т.е. одинаковые значения в parent и child половинках.
Дочерние узлы содержат значения [parent_id],[parent_rng] родительского узла, и [child_id],[child_rng] - своего.
Например:
('_1Z00JIJI2',0,'_1Z00JIJI2',0) - корневой узел
('_1Z00JIJI2',0,'_1Z00JIJI2',1) - дочерний
('_1Z00JIJI2',1,'B1YD13B28O',0) - "внучатый"
И т.д., вложенность около 1000
Задача:
Раскрыть дерево в таблицу "общий предок" - "текущий узел".
Т.е. должно быть:
('_1Z00JIJI2',0,'_1Z00JIJI2',0)
('_1Z00JIJI2',0,'_1Z00JIJI2',1)
('_1Z00JIJI2',0,'B1YD13B28O',0)
Я знаю, что это просто. Но не могу уложить это в голове.
Помогите!