Требуется оракул Запрос для отображения данных в одной строке - PullRequest
0 голосов
/ 10 октября 2019

Мне нужен запрос для отображения данных .. где

A - ссылка на B

B - ссылка на C

C - ссылка на D

D является ссылкой на E

В той же таблице в другом столбце в той же таблице, что и

col1 - col2

A - B

B -C

C - D

D - E

Мне нужно, чтобы данные отображались в виде E, D, C, B, A с указанием E

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Это типичный иерархический запрос Oracle.

Для начала рассмотрим следующий запрос, который возвращает всех родителей записи, чье col2 имеет значение 'E':

select col1, col2, level 
from mytable 
start with col2 = 'E' 
connect by prior col1 = col2;

Возвращает:

COL1 | COL2 | LEVEL
:--- | :--- | ----:
D    | E    |     1
C    | D    |     2
B    | C    |     3
A    | B    |     4

Теперь мы можем превратить это в подзапрос и использовать статистическую функцию LISTAGG() для получения ожидаемого результата:

select listagg(case when lvl = 1 then col2 || ',' end || col1, ',') 
    within group(order by lvl) seq
from (
    select col1, col2, level lvl 
    from mytable 
    start with col2 = 'E' 
    connect by prior col1 = col2
) x;
| SEQ       |
| :-------- |
| E,D,C,B,A |

Демонстрация на DB Fiddle

1 голос
/ 10 октября 2019

Используйте иерархический запрос с SYS_CONNECT_BY_PATH:

Установка Oracle :

CREATE TABLE table_name ( col1, col2 ) AS
SELECT 'A', 'B' FROM DUAL UNION ALL
SELECT 'B', 'C' FROM DUAL UNION ALL
SELECT 'C', 'D' FROM DUAL UNION ALL
SELECT 'D', 'E' FROM DUAL

Запрос :

SELECT SUBSTR( SYS_CONNECT_BY_PATH( col2, ',' ) || ',' || col1, 2 ) AS path
FROM   table_name
WHERE  CONNECT_BY_ISLEAF = 1
START WITH col2 = 'E'
CONNECT BY PRIOR col1 = col2;

Выход :

| PATH      |
| :-------- |
| E,D,C,B,A |

дБ <> скрипка здесь

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