我有一个包含以下数据的表
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但我怀疑这是最好的方式。
提前致谢
答案 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