SQL-запрос для получения полного пути иерархии из разных таблиц - PullRequest
2 голосов
/ 05 апреля 2011

Это очень актуально для вопроса SQL-запрос для получения полного пути иерархии .

Единственное отличие состоит в том, что моя иерархия содержит разные типы сущностей из разных таблиц, например:

  1. Проект
  2. Фаза
  3. Папка
  4. Документ

Я хочу выбрать все документы вместе с их полными путями (от уровня проекта до уровня папки).Фазы и папки могут иметь подфазы и папки.

Я ужасен в SQL и просто не могу понять, как адаптировать ответ к связанному вопросу в соответствии с моими потребностями.

Модель данных и пример данных

DECLARE @Project TABLE (ID INTEGER, Name VARCHAR(32))
DECLARE @Phase TABLE (ID INTEGER, Project_ID INTEGER, Parent_Phase_ID INTEGER, Name VARCHAR(32))
DECLARE @Folder TABLE (ID INTEGER, Phase_ID INTEGER, Parent_Folder_ID INTEGER, Name VARCHAR(32))
DECLARE @Document TABLE (ID INTEGER, Folder_ID INTEGER, Name VARCHAR(32))

INSERT INTO @Project VALUES (1, 'MyProject')

INSERT INTO @Phase
  SELECT 1, 1, 0, 'MyPhase1'
  UNION ALL SELECT 2, 1, 1, 'MyPhase1_1'
  UNION ALL SELECT 3, 1, 0, 'MyPhase2'

INSERT INTO @Folder
  SELECT 1, 1, 0, 'MyFolder'
  UNION ALL SELECT 2, 1, 1, 'MySubFolder'
  UNION ALL SELECT 3, 1, 0, 'AnotherFolder'

INSERT INTO @Document
  SELECT 1, 2, 'MyDocument'
  UNION ALL SELECT 2, 3, 'AnotherDocument'

Пример

MyProject1 ................ Project
- MyPhase1 ................ Phase
  - MyPhase1_1 ............ Phase
    - MyFolder ............ Folder
      - MySubfolder ....... Folder
        - MyDocument ...... Document
    - AnotherFolder ....... Folder
      - AnotherDocument ... Document
- MyPhase2 ................ Phase

Идеальные результаты запроса в этом случае:

Document        | Path
MyDocument      | MyProject1/MyPhase1/MyPhase1_1/MyFolder/MySubfolder  
AnotherDocument | MyProject1/MyPhase1/MyPhase1_1/AnotherFolder

1 Ответ

1 голос
/ 05 апреля 2011

Из того, что вы показали, я предполагаю, что у вас есть 4 таблицы с отношением один ко многим между Project and Phase, Phase and Folder и Folder and Document.

Тогда ваш оператор SQL может быть таким же простым, как объединение их всех вместе

SELECT *
FROM   Projects p
       INNER JOIN Phases ph ON ph.ProjectID = p.ProjectID
       INNER JOIN Folders f ON f.PhaseID = ph.PhaseID
       INNER JOIN Documents d ON d.FolderID = f.FolderID

Я действительно не вижу необходимости делать это более трудным, чем нужно, добавив CTE

...