【问题标题】:Connect child record to parent and grand parents将子记录连接到父母和祖父母
【发布时间】:2015-05-03 14:13:57
【问题描述】:

items 表中的每个项目都有一个部门ID,每个部门ID 最多可以有3 个祖父母。现在我需要显示每个项目及其部门和父母。

我做了 3 个简单的连接,就成功了。

SELECT        tDepartment.id, tDepartment.Name, tDepartment_1.Name AS Parent1, tDepartment_2.Name AS Parent2, tDepartment_3.Name AS Parent3
FROM            tDepartment AS tDepartment_3 RIGHT OUTER JOIN
                         tDepartment LEFT OUTER JOIN
                         tDepartment AS tDepartment_1 ON tDepartment.ParentID = tDepartment_1.id LEFT OUTER JOIN
                         tDepartment AS tDepartment_2 ON tDepartment_1.ParentID = tDepartment_2.id ON tDepartment_3.id = tDepartment_2.ParentID
ORDER BY tDepartment.Name 

我的问题是,是否可以通过使用 CTE 或任何其他想法以更清洁的方式完成?

【问题讨论】:

  • 该代码对我来说看起来不错。您可能需要 CTE 的原因是您希望它递归地找到每个父级,然后是该父级的父级,依此类推。如果是这种情况,请查找递归 CTE 的示例,其中有很多。如果您不喜欢查看自己编写的查询,请将其弹出到视图中,然后查询该视图。
  • 右连接做你想做的事,但我只会使用左连接来减少下一个人的困惑。 CTE 可以做同样的事情,但我不认为它更干净。
  • 感谢您的 cmets
  • 术语“层次结构”和“路径”适用。他们会帮助你找到合适的例子。提示:使用适当的软件(MySQL、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案。

标签: sql-server tsql parent-child sql-server-2014


【解决方案1】:

为什么要左右混合?

SELECT tDepartment.id, tDepartment.Name
      ,tDepartment_1.Name AS Parent1
      ,tDepartment_2.Name AS Parent2
      ,tDepartment_3.Name AS Parent3
  FROM tDepartment 
  LEFT OUTER JOIN tDepartment AS tDepartment_1 
       ON tDepartment.ParentID = tDepartment_1.id 
  LEFT OUTER JOIN tDepartment AS tDepartment_2 
    ON tDepartment_1.ParentID = tDepartment_2.id
  LEFT OUTER JOINtDepartment AS tDepartment_3                      
       ON tDepartment_3.id = tDepartment_2.ParentID
 ORDER BY tDepartment.Name 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-30
    • 2020-07-25
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    相关资源
    最近更新 更多