我的情况:
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
答案 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;