【问题标题】:sysbase sql query a treesybase sql查询一棵树
【发布时间】:2011-12-26 21:59:25
【问题描述】:

我已经看到了很多关于这个问题的答案,但我仍然不知道该怎么做。 我正在使用 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 专业知识有点生疏)。

谢谢

【问题讨论】:

  • 哪个 Sybase RDBMS?哪个版本?
  • @VincentBuck select @@version 给出: Adaptive Server Enterprise/12.5.4/EBF 16785 ESD#10/P/Sun_svr4/OS 5.8/ase1254/2159/64-bit/FBO/Mon Nov 2 2009 年 13:08:08

标签: sql recursion tree sybase


【解决方案1】:

这个问题有很多解法,各有优缺点, 并没有理想。这取决于您的任务。

其中一个解决方案是转换闭合 (http://en.wikipedia.org/wiki/Transitive_closure)。

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

缺点 - 由于非规范化,难以维护和大容量。

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

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

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

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

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

【讨论】:

  • 您能否详细说明,或提供一些在您的示例中填充 Transition 和 Node 的 sql?在维护方面,我可以将它们创建为临时表并在返回我想的结果后删除它们。就性能而言,这将每天调用一次,因此花费一分钟左右应该是可以接受的。
【解决方案2】:

我明白了吗,你只是想要那个表的查询。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多