SQL - 显示递归关系中的所有父母

Posted

技术标签:

【中文标题】SQL - 显示递归关系中的所有父母【英文标题】:SQL - Showing all parents from recursive relationship 【发布时间】:2014-11-29 03:05:58 【问题描述】:

我有一个类别表。这具有递归关系,因此一个类别可以成为另一个类别的子类别。该表如下所示:

id  name    short_desc  long_desc   tag_id  parent_id

我写了简单的获取 sql 来查找所有级别 1 的类别:

 SELECT * FROM category WHERE parent_id =0

然后我编写了一个查询来获取所有 2 级类别(其中父类别没有父类别)

SELECT * FROM category WHERE parent_id IN (SELECT id FROM category WHERE parent_id =0)

我想做的是生成一个列,其中显示所有类别数据和任何相关的父类别。

逻辑上是这样的:

    从类别中选择所有 如果 parent_id != 0,则将父级添加为新行 重复 2 直到所有父母都被计算在内。

结果应该是这样的:

id  name    short_desc  long_desc   tag_id   parent_name  parent_name_2

如果 parent_name 为 null / 为空,则 parent_name 应保持为空。如果字段中有 parent_name id,则检查是否有 parent_name_2,如果有,则填充两列,如果没有,则仅填充 parent_name。

我确实可以选择在 jquery 或 php 中进行编码,我很清楚该怎么做。但是,我确信我可以从一个好的 SQL 查询中获得我需要的数据。

任何帮助将不胜感激。

亲切的问候

尼克

【问题讨论】:

如果您知道潜在级别的数量,您可以使用多个外部自连接。如果未知,则需要使用动态 sql。关于 SO 的几个例子... 最多只有 3 个级别。父母,孩子,孙子。 【参考方案1】:

这是使用多个外连接的一个选项:

select c.*, 
  case when c2.id is not null then c2.name end parent_name,
  case when c3.id is not null then c3.name end parent_name_2
from category c
  left join category c2 on c.parent_id = c2.id
  left join category c3 on c2.parent_id = c3.id
SQL Fiddle Demo

【讨论】:

效果很好!感谢您的链接,以前从未见过,但非常非常有用!再次感谢:)

以上是关于SQL - 显示递归关系中的所有父母的主要内容,如果未能解决你的问题,请参考以下文章

sql server 递归查询

SQL Server 递归自联接

递归SQL语句

sql语句递归查询(start with)

MS SQL Server中的递归函数比较值

SQL 递归查询,意淫CTE递归的执行步骤