2014-08-04 2 views
0

У меня есть таблица, которая содержит следующие данныеИспользование SQL для рекурсивного поиска таблицы для родительских отношений ребенка

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 

простой способ объяснить это то, что я пытаюсь выяснить, какие из статей все они связаны с тем же издателем (The издатель тот же, если у них один и тот же родитель).

Я знаю, как присоединиться к таблицам, но я недостаточно осведомлен, чтобы сделать рекурсивный поиск, в котором я боюсь.

Еще один вариант, который я попробовал, - это присоединиться к таблице с самим собой (предоставляя другой псевдоним) и делать, где a.parent = b.parent и b.rownum <> a.rownum, но я сомневаюсь, что это лучший способ сделать Это.

Заранее спасибо

+0

Это может помочь http://stackoverflow.com/questions/4659803/ recursion-in-oracle – christiandev

+0

'rownum' - это построенная на основе набора результатов и не может использоваться для однозначной идентификации строки. Использование этого в сравнении, как правило, плохая идея. – Allan

ответ

2

Мой выход не точно соответствовать вашему, и я уверен, что Theres лучшего способа иметь дело с дубликатами, тогда внешними отчетливым я делаю, но я думаю, что это должно получить вас близко.

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 
Смежные вопросы