sybase sql查询一棵树

时间:2011-11-11 10:25:13

标签: sql recursion tree sybase

我已经看到了很多这个问题的答案,但我仍然无法弄清楚如何去做。 我正在使用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专业知识有点生疏了。)

谢谢

2 个答案:

答案 0 :(得分:1)

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

其中一个解决方案是Transition Closure(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

当然,您必须创建一个存储过程或触发器来填充和维护Transition表。

还有其他解决方案(数量较少但更难更新)但您可以从这个开始。

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

答案 1 :(得分:0)

我是否理解,您只需要查询该表。

所以,你需要做这样的事情:

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

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