2009-11-20 77 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