2012-01-04 96 views
3

我有一個項目ID和一個'inherit id'的記錄,即當前項目繼承的項目。繼承級別未知。SQL遞歸記錄:如何摺疊爲「僅限一個級別」?

我現在需要摺疊此於:

例如, '從最頂部的繼承':

1006 <- 1005 <- 1002 <- 999 

prj_id/inherit_id

999/1002 

1002/1005 

1005/1006 

應崩

1006 <- 1005 

1006 <- 1002 

1006 <- 999 

prj_i d/inherit_id

999/1006 

1002/1006 

1005/1006 

這可以在沒有循環的SQL語句中完成嗎? 創建臨時表很好。 應該爲火鳥,SQL Server的工作,甲骨文9+(即3套報表是罰款)

我只得到了這麼遠:

,從本身的紀錄繼承記錄再次繼承:

select tt_prj_id,tt_name,tt_inherit_id from tt_prj a 

where a.tt_inherit_id in 

(select tt_prj_id from tt_prj b 

where b.tt_inherit_id is not null 

and b.tt_inherit_id > 0) 

誰能幫我進一步?

+0

據我所知,甲骨文是支持[分層查詢]唯一的引擎(http://docs.oracle .com/cd/B19306_01/server.102/b14200/queries003.htm)。 – dasblinkenlight 2012-01-04 13:48:23

+0

在MYSQL中,你也可以使用group_concat函數。 – 2012-01-04 13:54:37

+2

「根」項目具有什麼作爲inherit_id? – Alex 2012-01-04 13:56:24

回答

6

像下面這樣的東西應該讓你開始(這不是最終的解決方案!):

with recursive project_tree as (
    select tt_prj_id, cast(tt_prj_id as varchar(500))||'/' as id_path, tt_prj_id as root_id 
    from tt_prj 
    where tt_inherit_id = 0 

    union all 

    select c.tt_prj_id, id_path || cast(c.tt_prj_id as varchar(100)) ||'/', null 
    from tt_prj c 
    join project_tree p on c.tt_inherit_id = p.tt_prj_id 
) 
select * 
from project_tree; 

這工作火鳥2.5(可能也有2.1的工作,但我沒有一個在手,現在)

當你刪除關鍵字recursive(這是ANSI標準所要求的,但是從什麼時候開始Microsoft關心那個...)並且你需要用標準字符串連接||替換+運營商。

Oracle只支持11.2之前的遞歸CTE。 在以前的版本中,你需要重寫這個使用CONNECT BY,這woudl是這樣的:

select tt_prj_id, tt_inherit_id, sys_connect_by_path(tt_prj_id, '/') 
from tt_prj 
start with tt_inherit_id = 0 
connect by prior tt_prj_id = tt_inherit_id; 
+0

我認爲'||'必須替換爲'+'的代碼才能在tsql中工作(半個問題,半個評論在這裏......從來沒有在tsql中看到過這個操作符bef礦石) – Alex 2012-01-04 15:54:26

+0

@Alex:正確我總是忘記了微軟也違反了SQL規則。 – 2012-01-04 16:02:07

+0

是否有某些原因需要連接?如果你要做的只是「根」節點和「當前」節點,那麼根可以簡單地傳播。 – 2012-01-04 17:08:58

1

transitive closure tablesnested sets上進行搜索。它們的結構使得高效地查詢關係數據成爲可能,但是對插入/更新/刪除需要更多的維護,並且閉包表需要存儲額外的記錄(效率的折衷空間)。

+0

感謝Sam,但是沒有必要在應用程序中擁有正確的嵌套數據庫結構,這只是一次性更新腳本對於一個表在當前數據結構上運行,下一個應用程序版本只允許一個繼承 – 2012-01-04 14:07:00

+0

好吧,不知道你如何使用'n'級關係來表,然後編寫沒有循環的SQL。 .. – Sam 2012-01-04 14:17:53