как выбрать и присоединиться к той же таблице в mssql [duplicate]

2
задан marc_s 22 March 2017 в 16:10
поделиться

1 ответ

Рекурсивный cte для спасения ....

Создать и заполнить таблицу образцов (пожалуйста, сохраните нам этот шаг в ваших будущих вопросах):

DECLARE @T as table
(
    id int,
    name varchar(100),
    parent_id int
)

INSERT INTO @T VALUES
(1, 'A', NULL),
(2, 'A.1', 1),
(3, 'A.2', 1),
(4, 'A.1.1', 2),
(5, 'B', NULL),
(6, 'B.1', 5),
(7, 'B.1.1', 6),
(8, 'B.2', 5),
(9, 'A.1.1.1', 4),
(10, 'A.1.1.2', 4)

Cte:

;WITH CTE AS
(
    SELECT id, name, name as path, parent_id
    FROM @T 
    WHERE parent_id IS NULL
    UNION ALL
    SELECT t.id, t.name, cast(cte.path +','+ t.name as varchar(100)), t.parent_id
    FROM @T t
    INNER JOIN CTE ON t.parent_id = CTE.id
)

Запрос:

SELECT id, name, path
FROM CTE

Результаты:

id      name        path
1       A           A
5       B           B
6       B.1         B,B.1
8       B.2         B,B.2
7       B.1.1       B,B.1,B.1.1
2       A.1         A,A.1
3       A.2         A,A.2
4       A.1.1       A,A.1,A.1.1
9       A.1.1.1     A,A.1,A.1.1,A.1.1.1
10      A.1.1.2     A,A.1,A.1.1,A.1.1.2

См. онлайн-демонстрацию в реестре

9
ответ дан Zohar Peled 20 August 2018 в 07:02
поделиться
  • 1
    Должен ли запрос быть SELECT id, name, path FROM CTE? – Mihai Ovidiu Drăgoi 22 March 2017 в 16:20
  • 2
    @ MihaiOvidiuDrăgoi правильно, я немного поиграл с ним и забыл удалить as. теперь исправлено. – Zohar Peled 22 March 2017 в 16:22
  • 3
    @ZoharPeled: потрясающе. Я не ожидал такого полного ответа. В будущем я обязательно буду включать примеры данных. Ниже приведен запрос в действии с некоторыми моими фактическими данными: link – Carel 23 March 2017 в 11:24
Другие вопросы по тегам:

Похожие вопросы: