Sql 从数据库中获取最后一个子项
我的情况:Sql 从数据库中获取最后一个子项,sql,sqlanywhere,Sql,Sqlanywhere,我的情况: Table A ( ID Parent_Id TimeStamp ) 根目录的父目录Id为null,子目录的父目录Id为null 我只想得到每一张桌子的最后一个孩子。 我不想要父亲和孩子。除了最后一个 有没有可能构建一个SQL来实现这一点 附言:我正在使用sql anywhere 11。也许ansi sql可以解决这个问题,我不确定 编辑:编辑以提供其他详细信息 我不想要元素的最后一个子元素 例如: Id 1 父空值 Id 2 父1 最后一个孩子 父1 Id 4 父空值 最后一个孩
Table A
(
ID
Parent_Id
TimeStamp
)
根目录的父目录Id为null,子目录的父目录Id为null
我只想得到每一张桌子的最后一个孩子。
我不想要父亲和孩子。除了最后一个
有没有可能构建一个SQL来实现这一点
附言:我正在使用sql anywhere 11。也许ansi sql可以解决这个问题,我不确定
编辑:编辑以提供其他详细信息
我不想要元素的最后一个子元素
例如:
Id 1
父空值
Id 2
父1
最后一个孩子
父1
Id 4
父空值
最后一个孩子
家长4
我想得到:
Id 3
身份证5
换句话说,从表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
如果“最后一个子项”指的是本身没有子项且通常被称为叶级项的项,则类似这样的内容应该可以:
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,但这是非常基本的语法,只需稍加修改即可使用。使用存储函数
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
对于Postgres9.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;
请检查您的答案,因为我提供了更多详细信息。是的!这个函数返回的正是我想要的。谢谢。再次感谢,不带函数的sql版本更适合我。几年后,oops将第一个查询的子查询调整为从父查询Id不为null的位置读取select Parent\u Id。顶级项的ParentId为空,子查询列表中的ParentId为空会把事情搞砸。
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;