0

我将尝试解释表格的布局方式,以便我需要的内容可能更清楚一些。

###############################################################
# cid # iid # child cid # child iid # target cid # target iid #
############################################################### 
# 112 # 1   # null      # null      # 116        # 1          #
# 112 # 2   # 112       # 1         # null       # null       #
# 112 # 3   # 112       # 1         # 116        # 2          #
# 112 # 4   # 112       # 1         # 100        # 3          #
# 112 # 101 # null      # null      # 116        # 101        #
# 112 # 102 # 112       # 101       # null       # null       #
# 112 # 103 # 112       # 101       # 116        # 102        #
# 112 # 201 # null      # null      # 116        # 201        #
# 112 # 202 # 112       # 201       # null       # null       #
# 112 # 203 # 112       # 201       # 116        # 202        #
# 112 # 301 # null      # null      # 116        # 301        #
# 112 # 302 # 112       # 301       # null       # null       #
# 112 # 302 # 112       # 301       # 116        # 302        #

上面是我试图从中获取数据的表格的缩减表示。对不起,如果布局有点废话。这里的每一行都是一个对象。这些对象中的每一个都可以有子对象,例如,第一行没有子对象但链接到目标对象。第二行有一个子对象,并且没有链接到目标对象,但是,它通过确实有目标对象的子 cid 和 iid 链接回第 1 行。第三行也链接到第一行,但它也有一个目标对象,所以我实际上不想回到第一行。

其他表

#########################################
# cid # iid # col1 # col2 # col3 # col4 #
#########################################
# 116 # 1   # a    # null # 16   # 1    #
# 116 # 2   # b    # 1    # 6    # null #
# 116 # 3   # n    # 1    # 11   # 2    #
# 116 # 101 # n    # 2    # 61   # 3    #
# 116 # 102 # b    # null # 161  # 101  #
# 116 # 201 # a    # 33   # 312  # 116  # 
# 116 # 202 # a    # 33   # 312  # 116  # 
# 116 # 301 # s    # 56   # 1321 # 33   #
# 116 # 302 # r    # 6    # 22   # 12   #

结果表

###########################################################################################
# cid # iid # child cid # child iid # target cid # target iid # col1 # col2 # col3 # col4 #
###########################################################################################
# 112 # 1   # null      # null      # 116        # 1          # a    # null # 16   # 1    #
# 112 # 2   # 112       # 1         # null       # null       # a    # null # 16   # 1    #
# 112 # 3   # 112       # 1         # 116        # 2          # b    # 1    # 6    # null #
# 112 # 4   # 112       # 1         # 100        # 3          # n    # 1    # 11   # 2    #
# 112 # 101 # null      # null      # 116        # 101        # n    # 2    # 61   # 3    #
# 112 # 102 # 112       # 101       # null       # null       # n    # 2    # 61   # 3    #
# 112 # 103 # 112       # 101       # 116        # 102        # b    # null # 161  # 101  #
# 112 # 201 # null      # null      # 116        # 201        # a    # 33   # 312  # 116  #
# 112 # 202 # 112       # 201       # null       # null       # a    # 33   # 312  # 116  #
# 112 # 203 # 112       # 201       # 116        # 202        # a    # 33   # 312  # 116  # 
# 112 # 301 # null      # null      # 116        # 301        # s    # 56   # 1321 # 33   #
# 112 # 302 # 112       # 301       # null       # null       # s    # 56   # 1321 # 33   #
# 112 # 302 # 112       # 301       # 116        # 302        # r    # 6    # 22   # 12   #

[只是为了澄清,在第一个表中,目标 cid 和 iid 与我链接到的另一个表中的 cid 和 iid 相关。]

本质上,我需要的是递归地遍历表,直到一行具有目标对象引用。

如果一行同时具有子 c/i id 和目标 c/i id,我只想要目标 c/i id。

谁能指出我正确的方向?

我正在慢慢阅读 http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm但我发现它有点混乱。我不会完全是更简单的 SQL 查询方面的专家,所以递归现在有点过头了。

谢谢

编辑:添加了其他表格和结果的示例

4

1 回答 1

3

我不知道你到底需要什么,但你可以从 tihs statment 开始

select cid, iid, level, connect_by_root(target_cid), connect_by_root(target_iid)
from tab
connect by    prior cid = child_cid
          AND prior iid = child_iid
          AND target_cid is null          
; 

然后过滤您需要的条目

select *
from 
(
select cid, iid, level, connect_by_root(target_cid) as target_cid, connect_by_root(target_iid) as target_iid
from tab
connect by    prior cid = child_cid
          AND prior iid = child_iid
          AND target_cid is null          
)
where target_cid is not null
;          

    CID IID TARGET_CID TARGET_IID
    ++++++++++++++++++++++++++++++
    112 1     116         1
    112 2     116         1
    112 3     116         2
    112 4     100         3
    112 101   116         101
    112 102   116         101
    112 103   116         102
    112 201   116         201
    112 202   116         201
    112 203   116         202
    112 301   116         301
    112 302   116         301
    112 302   116         302
于 2013-07-11T12:35:56.820 回答