这在SQL中可行吗?

时间:2010-08-18 03:32:26

标签: sql hierarchical-data

假设我有一个名为'species'的表格有3列:'Id','ancestorId'和'name'。 'ancestorId'是祖先物种的'Id',例如,如果智人的祖先是南方古猿,而南方古猿的'Id'是5,那么智人的'祖先'是5.我们也说,有一个名为'First specie'的物种,其'Id'为0或null。所以我想要的是选择一个特定物种的祖先列表,比如说智人,到“第一个物种”,无论路上有多少个节点。这可能与SQL有关吗?

5 个答案:

答案 0 :(得分:3)

Managing Hierarchical Data in MySQL对于您所谈论的内容来说是一个很好的资源,特别是如果您正在使用没有递归查询支持的数据库系统。它讨论了如何构建数据以便更轻松地执行您想要的操作。

答案 1 :(得分:3)

ANSI方式是使用递归WITH子句:

WITH hierarchy AS (
  SELECT t.id, 
         t.name,
         t.ancestor
    FROM TABLE t
   WHERE t.ancestor IS NULL
  UNION
  SELECT t.id, 
         t.name,
         t.ancestor
    FROM TABLE t
    JOIN hierarchy h ON h.ancestorid = t.id)
SELECT *
  FROM hierarchy

支持者:

  • SQL Server 2005 +
  • Oracle 11gR2
  • PostgreSQL 8.4 +

自v2以来,Oracle使用CONNECT BY语法支持分层查询。

答案 2 :(得分:0)

是的,我可以在SQL中使用它。您可以为此目的使用递归查询。看看here。阅读整页。

WITH req_query AS 
(
  SELECT  id, 
          name,
          ancestorid
  FROM    your_table
  WHERE   name='homo sapiens'    //If you want to search by id, then change this line

  UNION

  SELECT  yt.id, 
          yt.name,
          yt.ancestorid
  FROM    your_table yt,
          req_query rq
  WHERE   yt.id = rq.ancestorid
          AND rq.id != 0
          AND rq.id is not null
)

SELECT  * 
FROM    req_query
;

修改 这将适用于ORACLE,SQL Server,PostgreSQL以及任何其他具有递归查询支持的数据库。要处理不支持递归查询的数据库,您必须使用嵌套集模型。

答案 3 :(得分:0)

WITH hierarchy AS ( 
  SELECT t.id,  
         t.name, 
         t.ancestor 
    FROM TABLE t 
   WHERE t.ancestor IS NULL 
  UNION 
  SELECT t.id,  
         t.name, 
         t.ancestor 
    FROM TABLE t 
    JOIN hierarchy h ON h.ancestorid = t.id) 
SELECT * 
  FROM hierarchy 

答案 4 :(得分:0)

你很可能不想让你的第一个物种的ID为null。 null与0非常不同.null表示您不知道该值是什么。 0表示该值为0.请注意,null<> null和0 = 0.这可能会影响您搜索识别物品的方式。