2009-11-20 78 views
1

我的情況:從數據庫中獲取最後的孩子

Table A 
(
ID 
Parent_Id 
TimeStamp 
) 

根有PARENT_ID空和孩子都有父親的標識。

我簡單地想要得到每個表A的所有最後的孩子。 我不想要的父親和孩子。 (除了最後一個)。

是否有可能建立一個SQL來獲得這個?

PS:我在任何地方使用sql 11.也許一個ansi sql可以解決這個問題,我不確定。

編輯:(編輯給出更多的細節) 我不想從元素的最後孩子。

實施例:

編號1 父NULL

編號2 父1

ID 3(最後一個子) 父1

ID 4 父NULL

Id 5(最後一個孩子) 父4

我想: ID 3 ID 5

+0

請檢查您的答案,因爲我給了其他詳細信息。 – Ismael 2009-11-20 18:51:59

回答

3

使用存儲功能

create function LastChild(in parent integer) 
returns integer 
begin 
    declare res integer; 
    select top 1 id into res from TableA where parent_id = parent order by timeCol desc; 
    return res; 
end 

選擇

select Id, lastchild(id) from TAbleA where parent_id is null 

我將不存儲功能的其他解決方案的工作。

編輯:無存儲功能:

select Id, (select top 1 id from TableA childs where parent_id = TableA.id order by timeCol desc) from TableA where parent_id = 0 
+1

是的!該函數正是我想要的。謝謝。 – Ismael 2009-11-20 19:18:24

+1

再次感謝,沒有功能的sql版本更適合我。 – Ismael 2009-11-20 19:30:00

0
select * from a where id not in (select parent_id from table a) 

換句話說,選擇了從表中,其中項目的ID不是任何其他項目的父ID。這會給你圖的所有葉節點。

編輯:
你的編輯是有點混亂,和ID的通常不作爲排序機制,但無論如何,你給的例子可以通過這個查詢

SELECT MAX(id) 
FROM a 
WHERE id NOT IN 
    (SELECT parent_id 
     FROM a 
     WHERE parent_id IS NOT NULL 
) 
GROUP BY parent_id 
3

通過「最後完成的。如果孩子」你的意思是自己有沒有孩子(通常被稱爲葉級項目)的項目,這樣的事情應該做的:

SELECT ID 
from A 
where ID not in (select Parent_Id from A) 

相關子查詢的版本有一些技巧來理解,但會工作得更快在大表:

SELECT ID 
from A OuterReference 
where not exists (select 1 from A where Parenti_ID = OuterReference.ID) 

(「OuterReference」是表格中的別名)

我使用SQL Server,但是這是非常基本的語法,應該爲你工作,以最少的修改。

+0

(多年後,oops)將第一個子查詢調整爲讀取'(從Parent_Id不爲空的A中選擇Parent_Id)'。頂級項目將有一個空ParentId,並在子查詢的列表中有空值會弄亂事情。 – 2014-02-26 15:02:12