从数据库中获取最后一个孩子

时间:2009-11-20 18:37:44

标签: sql sqlanywhere

我的情况:

Table A
(
ID
Parent_Id
TimeStamp
)

root的Parent_Id为null,children的父亲为Id。

我很想简单地得到每张桌子A的所有最后一个孩子。 父亲和孩子我不想要。 (除了最后一个)。

是否可以构建一个SQL来实现这个目标?

PS:我在sql的任何地方11.也许ansi sql可以解决这个问题,我不确定。

编辑:(编辑以提供更多详情) 我不希望元素中的最后一个孩子。

示例:

Id 1 父NULL

Id 2 家长1

Id 3(最后一个孩子) 家长1

Id 4 父NULL

Id 5(最后一个孩子) 父母4

我想得到: Id 3 Id 5

4 个答案:

答案 0 :(得分: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”是表A的别名)

我使用的是SQL Server,但这是非常基本的语法,应该只需要很少的修改即可。

答案 1 :(得分: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

答案 2 :(得分:0)

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

换句话说,从表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 :(得分:0)

对于 Postgres 9.4,我不得不稍微更新查询以仅获取子类别

select count(id) from A as outer_ref where not exists(
    select 1 from A where parent_id=outer_ref.id) and parent_id is not null;