使用SQL递归搜索表以查找父子关系

时间:2014-08-04 18:12:59

标签: sql oracle oracle11g

我有一个包含以下数据的表

ArticleID   publisherID
----------------------------
1001        9001
1001        9002
1001        9003
1002        9004
1002        9005
1003        9006
1004        9007
1005        9008
1006        9009
1007        9010
1007        9011
1007        9012
1008        9013
1008        9014
1009        9015
1010        9016
1011        9017
1012        9018
1012        9019
1012        9020
1012        9021
1012        9022
1012        9023
1013        9024
1013        9025
1014        9026
1014        9027
1014        9028
1015        9029
1015        9030

文章可以与多个发布商相关联。该表中的发布者可以是相关的,即一个发布者可以是另一个发布者的父母。 我想知道的是,我想列出所有与相关发布商相关的文章。即使数据显示文章有不同的发布者,发布商实际上也是相同的,基于下面的发布商关系表:

publisherid publisher_parent_id
----------------------------------
9001            9001
9002            9001
9003            9001
9004            9004
9005            9005
9006            9006
9007            9007
9008            9008
9009            9009
9010            9011
9011            9011
9012            9011
9013            9014
9014            9014
9015            9015
9016            9016
9017            9017
9018            9035
9019            9035
9020            9035
9021            9035
9022            9035
9023            9035
9024            9025
9025            9025
9026            9026
9027            9027
9028            9028
9029            9030
9030            9030

基于上述父关系,我希望输出如下所示(即仅列出文章链接到多个父母的那些)

ArticleID   publisherID
----------------------------
1001        9001    (9001 is parent of 9002, 9003)
1007        9011    (9011 is parent of 9010, 9012)
1008        9014
1012        9035
1013        9025

解释它的一个简单方法是,我试图找出哪些文章都与同一个出版商有关(如果出版商拥有相同的父母,那么它们是相同的)。

我知道如何加入表格,但我不知道如何进行递归搜索,这是我正在努力的地方。

我尝试的另一个选项是将表连接到自身(提供不同的别名)并执行a.parent = b.parent和b.rownum<> a.rownum但我怀疑这是最好的方式。

提前致谢

1 个答案:

答案 0 :(得分:2)

我的输出并不完全与你的输出完全匹配,我很确定这是一个更好的方法来处理重复,然后是外部的不同我做,但我认为这应该让你接近。

SELECT DISTINCT * 
FROM (
    SELECT ARTICLES.ARTICLEID, CONNECT_BY_ROOT PUBLISHERS.PUBLISHERID PUBLISHERID
    FROM ARTICLES
    INNER JOIN PUBLISHERS
      ON ARTICLES.PUBLISHERID = PUBLISHERS.PUBLISHERID
    WHERE LEVEL > 1
    START WITH PUBLISHERS.PUBLISHER_PARENT_ID = PUBLISHERS.PUBLISHERID
    CONNECT BY NOCYCLE PRIOR PUBLISHERS.PUBLISHERID = PUBLISHERS.PUBLISHER_PARENT_ID
    ORDER SIBLINGS BY PUBLISHERS.PUBLISHERID
)
ORDER BY ARTICLEID, PUBLISHERID

您可以将其选为内部查询中的列以查看叶子(发布者之间的连接):

SYS_CONNECT_BY_PATH(PUBLISHERS.PUBLISHERID, ',') RELATED_PUBLISHERS