Как получить соответствующее значение для каждого значения? - PullRequest
1 голос
/ 19 марта 2020

Имея таблицу, как показано ниже

Main_mem    Neighnour_mem
---------------------------
101           -
102           -
103          102
104           -
105           -
106          105
107           -
108           -
109          108
110          108

Мне нужен вывод, как показано ниже

Main_mem    Neighnour_mem
---------------------------
101             -
102            103
104             -
105            106
107             -
108            109
108            110

Я пробовал запрос ниже, но не будет работать

SELECT A.Main_mem "Main_Member"
      , (SELECT Main_mem "Dependent_member" FROM family
          WHERE neigh_mem = A.Main_mem)"Dependent_member"
FROM family A

Как получить мой вывод?

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Вы можете сделать это с помощью self- left join и not exists:

select  
    f.main_mem,
    coalesce(f1.main_mem, f.neighnour_mem) neighnour_mem
from family f
left join family f1 on f1.neighnour_mem = f.main_mem
where not exists (select 1 from family f2 where f2.main_mem = f.neighnour_mem)
order by 1, 2

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

MAIN_MEM | NEIGHNOUR_MEM
:------- | :------------
101      | -            
102      | 103          
104      | -            
105      | 106          
107      | -            
108      | 109          
108      | 110          
0 голосов
/ 19 марта 2020

Если я правильно понимаю, вы хотите Neighnour_mem, которые не NULL, а затем Main_mem, у которых нет совпадений вообще:

select Neighnour_mem, Main_mem
from family f
where Neighnour_mem is not null 
union all
select f.Main_mem, null
from f
where not exists (select 1
                  from family f2
                  where f2.Neighnour_mem is not null and
                        f.Main_mem in (f2.main_mem, f2.Neighnour_mem)
                 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...