2015-12-15 1 views
0

У меня есть несколько таблиц «ТАБЛИЦА1», «ТАБЛИЦА2», «ТАБЛИЦА 3» и т. Д. В моей базе данных Oracle, имеющей ссылочную интегральность между ними. Теперь у меня есть таблица «TABLE_X», имеющая 3 столбца «parent_table», «child_table» и «order_id». В этой таблице «TABLE_X» хранится информация об иерархии всех таблиц «ТАБЛИЦА 1», «ТАБЛИЦА2», «ТАБЛИЦА 3» и т. Д. Столбец «order_id» соответствует уровню таблицы в иерархии. Напр. если «TABLE5» и «table4» дети «Table3» и «Table3» является потомком как «TABLE1» и «TABLE2», то мы будем иметь следующие 5 строк в «TABLE_X»:Oracle SQL-запрос или скрипт для поиска ссылочной иерархии таблиц

 parent_table  child_table  order_id 
    TABLE1    TABLE3    1 
    TABLE2    TABLE3    1 
    TABLE3    TABLE4    2 
    TABLE3    TABLE5    2 
    TABLE4    DUMMY    3 
    TABLE5    DUMMY    3 

Я хочу, чтобы написать сценарий SQL или SQL, который дает мне иерархию весь выходной в следующем формате: столбцам

 TABLE1 TABLE3 TABLE4 DUMMY 
    TABLE2 TABLE3 TABLE4 DUMMY 
    -------------------------------- 
    -------------------------------- 

Предположим, что самый высокий «Order_ID» является 6.

ответ

0

Try:

SELECT replace(sys_connect_by_path(parent_table,'/')||'/'||child_table, '/', ' ') 
FROM TABLE11 
WHERE connect_by_isleaf = 1 
START WITH ORDER_ID = 1 
CONNECT BY PRIOR CHILD_TABLE = PARENT_TABLE 
; 

===== EDIT ===========

Вы не упомянули в вопросе, который вы хотите получить также «промежуточные комбинации»

Просто комментарий одна строка в запросе, чтобы получить эти значения:

SELECT replace(sys_connect_by_path(parent_table,'/')||'/'||child_table, '/', ' ') 
FROM TABLE11 
WHERE connect_by_isleaf = 1 
--START WITH ORDER_ID = 1 
CONNECT BY PRIOR CHILD_TABLE = PARENT_TABLE 
; 

Это дает следующий результат:

TABLE1 TABLE3 TABLE4 DUMMY 
TABLE1 TABLE3 TABLE5 DUMMY 
TABLE2 TABLE3 TABLE4 DUMMY 
TABLE2 TABLE3 TABLE5 DUMMY 
TABLE3 TABLE4 DUMMY 
TABLE3 TABLE5 DUMMY 
TABLE4 DUMMY 
TABLE5 DUMMY 
+0

Спасибо kordirko ... Но это не дает мне правильный результат. Он не показывает мне промежуточные комбинации, такие как TABLE2 -> TABLE3 -> TABLE5 – Abhishek

+0

Я обновил ответ на примере, который показывает, как получить «промежуточные комбинации» – krokodilko

0

Другой способ использования предложения WITH.

with tree (root, parent, child, path) 
as 
(
select parent_table, 
     parent_table, 
     child_table, 
     parent_table || ' ' || child_table as path 
from TABLE_X 
where order_id =1 
union all 
    select t.root, 
      parent_table, 
      child_table, 
      path || ' ' || child_table 
    from tree t 
    left join Table_X X 
    on X.PARENT_TABLE = t.child 
    where t.parent is not null 
) 
select Path from tree 
where parent is null 

Он выглядит более сложным, чем другой пример, упомянутый здесь, но он может работать почти без изменений в других типах баз данных.

+0

Спасибо dcieslak. Но это не дает мне правильный результат. Он показывает DUMMY как прямой дочерний элемент из некоторых родительских таблиц, у которых есть другие дети. – Abhishek

+0

@Abhishek Это ответ на ваш вопрос, и это правильно. Если вы хотите что-то другое, то вам нужно более точно описать. Для ваших тестовых данных он возвращает 4 строки: 'TABLE1 TABLE3 TABLE4 DUMMY, TABLE1 TABLE3 TABLE5 DUMMY, TABLE2 TABLE3 TABLE4 DUMMY, TABLE2 TABLE3 TABLE5 DUMMY'. Это потому, что TABLE3 является родительским для TABLE4 и TABLE5. – dcieslak

Смежные вопросы