1

我有一个分层数据库结构,例如列IDPARENT_ID为每一行定义,顶层行具有NULL PARENT_ID.

我将这个表中的所有关系展平到另一个表中,例如,如果祖父母、父母、孙子的单个层次结构中有 3 条记录,则将有 3 条记录:

**ANCESTOR, DESCENDANT**
grantparent, parent
grandparent, grandchild
parent, grandchild

与其执行分层查询来确定孙子是祖父的后代,我可以简单地检查(grandparent, grandchild)这个扁平表中是否存在记录。

我的问题是,使用这个扁平表,我怎样才能最有效地返回两个节点之间的所有记录。使用示例,使用grandparentgrandchild作为我的参数,我怎样才能取回(grandparent, parent)记录。

我不想使用分层查询来解决这个问题......我想知道是否可以在没有任何连接的情况下做到这一点。

4

3 回答 3

2
SELECT  *
FROM    mytable
WHERE   descendant = @descendant
        AND hops < 
        (
        SELECT  hops
        FROM    mytable
        WHERE   descendant = @descendant
                AND ancestor = @ancestor
        )

这将自动处理@ancestor不是真正@descendant的祖先的情况。

为此创建一个索引以(descendant, hops)使其快速工作。

于 2010-11-03T18:42:08.123 回答
1

尝试:

select h1.descendant intermediate_node
from hierarchy h0 
join hierarchy h1 
  on h0.ancestor = h1.ancestor 
 and h0.hops > h1.hops  -- redundant condition, but may improve performance
join hierarchy h2
  on h1.ancestor = h2.ancestor 
 and h0.descendant = h2.descendant
where h0.ancestor = :ancestor and h0.descendant = :descendant
于 2010-11-03T18:33:32.450 回答
0
SELECT
   distinct ancestor 
FROM 
   hierarchy 
WHERE descendant = :1 AND 
      ancestor IN (
                    SELECT 
                       distinct descendant 
                    FROM 
                       hierarchy WHERE ancestor = :2
                  )
于 2010-11-03T19:47:35.810 回答