sysbase sql查询树

sysbase sql查询树,sql,recursion,tree,sybase,Sql,Recursion,Tree,Sybase,我已经看到了很多关于这个问题的答案,但我仍然不知道该怎么做。 我用的是Sybase。但我更喜欢标准的SQL答案 我有一个表,它形成了许多树结构。我想获得给定一组父节点的所有子节点的列表。以下表为例 parent child AA AAB AA AAC AAB AABA AAB AABB AAB AABC AAB AABD AAB AABE AAB AABF

我已经看到了很多关于这个问题的答案,但我仍然不知道该怎么做。 我用的是Sybase。但我更喜欢标准的SQL答案

我有一个表,它形成了许多树结构。我想获得给定一组父节点的所有子节点的列表。以下表为例

parent     child
AA          AAB
AA          AAC
AAB         AABA
AAB         AABB
AAB         AABC
AAB         AABD
AAB         AABE
AAB         AABF
AABB        AABBC
AABB        AABBA
AABB        AABBB
AABB        AABBC
BB          BBA
BB          BBB
BBB         BBBA
所以基本上,我想要一个查询,给定输入AA和BB,它会给我上面所有的条目。假设上面是一个目录结构,其结果类似于递归地获取一个或多个根目录的所有子目录

正如我所说,我看到这个问题被问了很多次,但我仍然找不到一个我可以使用的答案。有一些外部文章的链接,我读了3或4篇,但我想我无法将其转换为SQL。(我的sql专业知识有些生疏)


谢谢

这个问题有很多解决方案,每个都有自己的优缺点, 而且也不理想。这取决于你的任务

这种解决方案之一是转换闭包(http://en.wikipedia.org/wiki/Transitive_closure)

优点-非常简单的查询和性能

缺点-由于非规范化,难以维护且体积大

F.e.两个表是节点和转换\ 第一个表很明显,第二个表应该包含每个节点的所有子节点,包括级别为零的节点本身

create table Node (
   node_id              integer                        not null,
   name                 varchar(255)                   null,
   constraint PK_NODE primary key (node_id)
)
go
create table Transition (
   node_id              integer                        null,
   child_id             integer                        null,
   levl                 integer                        null
)
go
Lvl-level在许多查询中都是有用的列

例如,您可以通过简单查询获得任意节点的所有子节点:

select 
  c.node_id,
  c.name 
from
  Transition t,
  Node c
where 
  t.node_id = :id
and t.child_id = c.node_id
and lvl > 0
当然,您必须创建一个存储过程或触发器来填充和维护转换表

还有其他解决方案(批量成本较低,但更难更新),但您可以从这个解决方案开始


其他RDBMS,如Oracle内置的树查询支持(通过路径f.e连接),但这种查询类型在大型表上的性能非常差。

据我所知,您只需要该表的查询

因此,您需要执行以下操作:

select distinct parent, child from table
where parent like '%AA%'
OR parent like '%BB%'

如果这不是您需要的,请发表评论:)

哪个Sybase RDBMS?哪个版本?@VincentBuck select@@version给出:Adaptive Server Enterprise/12.5.4/EBF 16785 ESD#10/P/Sun_svr4/OS 5.8/ase1254/2159/64位/FBO/Mon Nov 2 13:08:08 2009您能否在上面的示例中详细说明或提供一些填充转换和节点的sql?在维护方面,我可以将它们创建为临时表,并在返回结果后删除它们。就性能而言,这将是每天调用一次,因此花费一分钟左右的时间应该是可以接受的。