【问题标题】:SQL query to get full hierarchy path from different tables用于从不同表中获取完整层次结构路径的 SQL 查询
【发布时间】:2011-04-05 08:59:32
【问题描述】:

这与SQL query to get full hierarchy path的问题非常相关。

唯一的区别是我的层次结构包含来自不同表的不同实体类型,例如:

  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

【问题讨论】:

    标签: sql-server-2005 select path hierarchy


    【解决方案1】:

    根据您显示的内容,我假设您有 4 个表,Project and PhasePhase and FolderFolder 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 来使其变得比需要的更困难

    【讨论】:

    • 阶段和文件夹可以有子阶段和子文件夹
    • 我添加了模型的一个快速子集。这是一个遗留项目,层次结构是这一切的核心,否则我会考虑重新考虑模型,例如将完整路径作为每个级别的字段包括在内,我相信这将使阅读和“树-构建“更简单,同时在更新期间产生少量成本。
    • @Kevin,对不起。我玩这个已经有一段时间了,但我不得不认输,它把我带到了很远的地方。我已经编辑了您的问题,以便为其他人提供开始处理您的问题所需的数据。
    • 非常感谢您的所有努力!如果可以的话,我会再次投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 2015-11-08
    相关资源
    最近更新 更多