2009-09-28 99 views
2

我有一張表,其中包含以下方式相關的記錄:數據庫表中的嵌套數據

父母,子女,孫子女。

我想能夠運行查詢,做到以下幾點:

  1. 檢索是 從一個特定的記錄下來的所有記錄
  2. 檢索的特定記錄的直接 兒童的所有記錄 (即只直接孩子)
  3. 檢索的特定記錄的 孫子 (即只孫子)的所有記錄
  4. 檢索記錄的祖父母
  5. 檢索記錄
  6. 檢索所有的記錄(以及他們的 子女和孫子女)

我想這個查詢的排序方式返回數據的父母,所以我可以創建一個結構化的文件(例如來自查詢結果的XML)。通過「分類」,我的意思是結果集「分組」,由家長THEN孩子,那麼孫子

我設計了一個簡單的表像這樣的(僞代碼):

CREATE TABLE family_tree {id integer 
        , parent_id integer 
        , child_id integer 
        , fname varchar(16) 
        , lname varchar(32) }; 

我有多少問題:

  1. (在心中的疑問我想運行軸承[(1) - (6)以上)是這是最好的(即最有效的表結構如果沒有我可以使用?,什麼是?

  2. 任何人都可以幫我編寫ANSI SQL語句來執行上面的查詢(1) - (6)嗎?

+0

ID,parentId的應sufficiant。你使用SQL Server 2005 +? – 2009-09-28 10:07:36

+1

搜索,以便像‘套組’和‘分層數據’,你會發現很多東西條款。 – markus 2009-09-28 10:10:01

+0

您正在使用什麼數據庫?Oracle有分層查詢(CONNECT BY) – Thilo 2009-09-28 10:11:40

回答

2

檢查sitepoint tutorial就可以了。

  • 存儲數據(id,parent_id)的遞歸方法允許您檢索特定節點的直接後代。
  • 預先定義的樹遍歷方法允許您檢索特定節點的整個分支。

所以有id,parent_id,left,right列是你最好的選擇。該教程保存了完整的代碼,但SQL查詢應該足夠清楚。

您應該能夠從教程中提供的所有查詢中獲得所有查詢。

0

我看你已經接受Eimantas的回答,他說,

「因此,有ID,PARENT_ID,左,右列是你最好的選擇。「

我想明確地指出,從引用鏈接(斜體礦)以下報價:

」添加節點

我們如何添加一個節點到樹?有兩種方法:你可以在你的表中保留父列,然後重新運行rebuild_tree()函數 - 一個簡單但不是那種優雅的函數; ,或者您可以更新新節點右側所有節點的左值和右值。