我有一个Oracle表结构,它类似于下面的表my_data
(CHILD, ROOT)
在my_data中包含以下示例数据:
CHILD ROOT
-----------------
AA A
AB A
AAA A
BB B
BBB B
BBBA B
BBBB B
C1 C
C2 C
C3 C
C4 C
C5 C
C6 C
C7 C
C8 C
基于上述示例数据,我需要生成一个SQL查询,该查询返回以下信息,即:
CHILD ROOT ROWNO
---------------------
AA A 1
AB A 2
AAA A 3
BB B 1
BBB B 2
BBBA B 3
BBBB B 4
C1 C 1
C2 C 2
C3 C 3
C4 C 4
C5 C 5
C6 C 6
C7 C 7
C8 C 8
我试过这样的方法,但没用。
SELECT ROOT, CHILD, ROWNUM AS ROWNO
FROM (
SELECT PARENT AS PARENT
, CONNECT_BY_ROOT(PARENT)ROOT
, CHILD
FROM MY_DATA
CONNECT BY NOCYCLE PRIOR CHILD = PARENT
) A
感谢任何帮助!
1条答案
按热度按时间pbwdgjma1#
rownum
是Oracle构建结果集时生成的伪列。它总是在增加。您需要的是一个row_number()
函数来为每个组生成新值。由于您根据前缀分配序号,因此可以根据前缀长度和相同长度的前缀的实际值来分配行号。| 儿童|根|RN|
| - -----|- -----|- -----|
| AA|一个|1|
| AB|一个|2|
| AAA|一个|3|
| BB| B| 1|
| 血脑屏障|B| 2|
| BBBA| B| 3|
| BBBB| B| 4|
| C1| C类|1|
| C2| C类|2|
| C3| C类|3|
| C4| C类|4|
| C5| C类|5个|
| C6| C类|六|
| C7| C类|七个|
| C8| C类|八|
fiddle