2010-08-18 35 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物種。