Как запросить несколько дочерних данных по одним основным данным? - PullRequest
0 голосов
/ 27 января 2020

Я хочу ВЫБРАТЬ одного родителя и всех детей под ним. Oracle продолжает показывать родителям своего ребенка. Подскажите пожалуйста, как отобразить следующий запрос в ORACLE из этого:

select d.department_name, e.last_name from employees e join departments d
on (d.department_id=e.department_id)
group by d.department_name, e.last_name
order by 1;

DEPARTMENT_NAME                LAST_NAME
------------------------------ ------------
Accounting                     Gietz
Accounting                     Higgins
Executive                      De Haan
Executive                      King
Executive                      Kochhar
-------------------------------------------

Как это:

DEPARTMENT_NAME                LAST_NAME
------------------------------ ------------
Accounting                     Gietz
                               Higgins
Executive                      De Haan
                               King
                               Kochhar
-------------------------------------------

Ответы [ 2 ]

0 голосов
/ 27 января 2020

Этот тип преобразования данных лучше всего выполнять на прикладном уровне. Но если вы хотите сделать это в SQL, вы можете использовать оконные функции - но с оговоркой, что порядок строк очень важен. Я бы предложил:

select (case when row_number() over (partition by d.department_id order by e.last_name) = 1
             then d.department_name
         end) as dept,
       last_name 
from employees e join
     departments d
     on d.department_id = e.department_id
group by d.department_name, e.last_name
order by d.department_name, dept nulls last;

Я также искренне сомневаюсь, что вам нужен group by, если в таблицах нет дубликатов. Итак:

select (case when row_number() over (partition by d.department_id order by e.last_name) = 1
             then d.department_name
         end) as dept,
       last_name 
from employees e join
     departments d
     on d.department_id = e.department_id
order by d.department_name, dept nulls last;
0 голосов
/ 27 января 2020

Вы можете использовать analytical function следующим образом:

Select case when rn = 1 then department_name end as dept
       ,last_name from
(select d.department_name, e.last_name,
       Row_number() over (partition by d.department_name order by e.last_name) as rn
 from employees e join departments d
on (d.department_id=e.department_id)
group by d.department_name, e.last_name)
order by department_name, rn;

Ура !!

...