Oracle中从此数据到此结果的最佳方式

时间:2009-07-09 20:47:47

标签: sql oracle

oracle从这样的表中获取以下结果集的最佳方法是什么:

GROUP ID VALUE
--------------------
1       1       A
1       2       B
1       3       C
2       4       D
2       5       E
3       6       F
4       7       G
4       8       H


ID  Parent  VALUE
---------------------
1       0       A
2       1       B
3       2       C
4       0       D
5       4       E
6       0       F
7       0       G
8       7       H

基本上,这样做的是获取按特定数字分组的数据,并从组中的条目中创建父子关系。

这样做的目的是通过查询将其添加到连接中,以便用逗号分隔一列中的值。

现在我可以使用一堆子查询和滞后函数来完成它,但似乎有更快的方法来实现它。

或者......我完全错过了一些东西,可以直接使用原始数据上的connect by先前命令。那将是最佳的!

修改

我似乎对这种情况感到困惑。我的最终目标(但不是这里的问题)是查询组号1并将结果A,B,C作为字符串放在一个列中。

我知道如何使用Connect by子句执行此操作。这不是问题。

问题是,为了使用connect by子句,您必须实际拥有分层格式的数据。

这就是我正在寻找一种更有效的方法。

2 个答案:

答案 0 :(得分:2)

是否有任何问题阻止您这样做:

SELECT t.ID,
       NVL((SELECT MAX(t2.ID)
              FROM Table t2
             WHERE t.GROUP = t2.GROUP
               AND t2.ID < t.ID), 0)      AS Parent_ID ,
       t.Value
  FROM TABLE t

可能你更喜欢Connect By Query,但如果性能不是太差,我觉得很简单。如果表现对您很重要,可以尝试类似的事情。

WITH aux AS( SELECT ID,
                     Value,
                     Group,
                     dense_rack() ( partition by GROUP order by ID) AS num
                FROM TABLE )

         SELECT t1.ID,
                t2.ID  AS parent,
                t1.Value
           FROM ( select * from aux ) t1  
      LEFT JOIN ( select * from aux ) t2 
             ON t1.group = t2.group 
            AND t1.ID    = t2.ID -1

答案 1 :(得分:1)

在消化了borjab的答案之后,我发现了另一种使用滞后函数的快速方法:

SELECT t.ID,
       LAG(ID,1,0) OVER (PARTITION BY GROUP ORDER BY ID) AS Parent_ID ,
       t.Value
FROM TABLE t