2010-08-18 36 views
1

假设我有一个名为'物种'的表,有3列:'Id','ancestorId'和'name'。 '祖先'是祖先物种的'Id',例如,如果智人的祖先是南方古猿,而南方猿的'Id'是5,那么智人的'ancestorId'是5.假设,有一种叫'第一物种'的物种,其'Id'为0或无效。因此,无论有多少节点在路上,我想要的是选择一个特定物种的祖先列表,比如说,智人,到'第一物种'。这可能与SQL?这是可能的SQL?

回答

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+

Oracle的层次结构q从v2开始支持uery,使用CONNECT BY语法。

3

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

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服务器,PostgreSQL和使用具有递归查询支持任何其他数据库。要处理不支持递归查询的数据库,您将不得不使用嵌套集模型。

+1

你也可以看看sasfrog的回答。嵌套集模型是管理分层数据的一个很好的解决方案。 – 2010-08-18 03:55:54

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 
+0

如果您发布的是代码或XML,**请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码”按钮(101 010),以良好地格式化和语法突出显示它! – 2010-08-18 04:48:05

0

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