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子句,您必须实际拥有分层格式的数据。
这就是我正在寻找一种更有效的方法。
答案 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