创建一系列链接

时间:2015-09-15 03:27:28

标签: oracle11g connect-by

想象一下,我有一个或多个段的路径。 每个路径都有一个 ID ,您可以使用 id 检查某个段是否来自路径。每个细分都有开始点和结束点。

问题是这些段没有作为begin-end-begin-end排序:

细分表:

id  | begin |  end  | start_with
123 |  'a'  |  'b'  | 'a'
123 |  'b'  |  'b'  | 'a'
123 |  'd'  |  'b'  | 'a'
123 |  'd'  |  'e'  | 'a'
123 |  'c'  |  'e'  | 'a'
123 |  'f'  |  'c'  | 'a'
456 |  'a'  |  'a'  | 'a'
456 |  'z'  |  'a'  | 'a'
456 |  'z'  |  'e'  | 'a'
789 |  'k'  |  'e'  | 'e'

我真正需要的是订购从开始到结束的每条路径的段,并给它序列数字,如下表所示:

id  | begin |  end  | sequence
123 |  'a'  |  'b'  | 1
123 |  'b'  |  'b'  | 2
123 |  'd'  |  'b'  | 3
123 |  'd'  |  'e'  | 4
123 |  'c'  |  'e'  | 5
123 |  'f'  |  'c'  | 6
456 |  'a'  |  'a'  | 1
456 |  'z'  |  'a'  | 2
456 |  'z'  |  'e'  | 3
789 |  'k'  |  'e'  | 1

这就是我要做的事情:

WITH t as (SELECT id, begin, end, start_with FROM segments)
SELECT distinct t.*,level sequence FROM t
        START WITH BEGIN = start_with OR END = start_with
        CONNECT BY NOCYCLE 
        PRIOR ID = ID
        AND (PRIOR BEGIN = END
          OR PRIOR BEGIN = BEGIN 
          OR PRIOR END = BEGIN 
          OR PRIOR END = END)

我相信我的解决方案并不是那么远,但我在这里遗漏了一些东西,而不是只有我需要的序列号,我得到了多个重复的序列号,就像它为每一个都创造了兄弟姐妹一样序列的水平。

此外,我从大约3k路径获得了大约4.5k段,并且它给了我数百万条记录。

拜托,欢迎任何帮助。

0 个答案:

没有答案