Multiple Join, чтобы вернуть только совпадающие поля - PullRequest
0 голосов
/ 16 мая 2019

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

У меня есть такой запрос:

select dc.STATUSWORK "DC STATUS", de.STATUSWORK "DE STATUS", r.STATUSWORK "R STATUS", g.STATUSWORK "G STATUS", c.STATUSWORK "CONTRACT Status", c.PYID 
from CONTRACT c
join VDC dc on (dc.COVERKEY = c.KEY)
join VDE de on (de.COVERKEY = c.KEY)
join RCK r on (r.COVERKEY = c.KEY)
join GDE g on (g.COVERKEY = c.KEY)
join CDOC c on (c.COVERKEY = c.KEY)
where c.PYID = 'C-1000';

Наверняка, если не все условия соединения совпадают, строки не будут возвращены, если яиспользуйте левое или правое соединение, также будут возвращены строки со значениями NULL

Как выполнить запрос, чтобы проверить, какие строки совпадают, и запросить новый запрос, чтобы получить только совпадающие таблицы / строки?

Ответы [ 2 ]

0 голосов
/ 16 мая 2019

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

create table CONTRACT(ConKey int, ConName varchar(20));

insert into CONTRACT(ConKey, ConName) Values(1, 'AAA');
insert into CONTRACT(ConKey, ConName) Values(2, 'BBB');
insert into CONTRACT(ConKey, ConName) Values(3, 'CCC');

create table VDC(VDCKey int, StatusWork varchar(20));  

insert into VDC(VDCKey, StatusWork) Values(1, 'Status 1');
insert into VDC(VDCKey, StatusWork) Values(3, 'Status 2');
insert into VDC(VDCKey, StatusWork) Values(4, 'Status 3');  

create table VDE(VDEKey int, StatusWork varchar(20));  

insert into VDE(VDEKey, StatusWork) Values(1, 'Status 4');
insert into VDE(VDEKey, StatusWork) Values(3, 'Status 5');
insert into VDE(VDEKey, StatusWork) Values(4, 'Status 6');  

create table RCK(RCKKey int, StatusWork varchar(20));  

insert into RCK(RCKKey, StatusWork) Values(5, 'Status 7');
insert into RCK(RCKKey, StatusWork) Values(2, 'Status 8');
insert into RCK(RCKKey, StatusWork) Values(1, 'Status 9');  

Вот запрос: -

Select c.ConKey, c.ConName, dc.StatusWork, de.StatusWork, r.StatusWork 
from CONTRACT c
LEFT JOIN VDC dc ON dc.VDCKey = c.ConKey
LEFT JOIN VDE de on de.VDEKey = c.ConKey
LEFT JOIN RCK r on r.RCKKey = c.ConKey;

Это результат: -

ConKey  ConName StatusWork  StatusWork  StatusWork
1       AAA     Status 1    Status 4    Status 9
2       BBB                             Status 8
3       CCC     Status 2    Status 5    
0 голосов
/ 16 мая 2019

Если я правильно понимаю, что вы хотите, это должно сделать это.Это вернет все строки из контракта, если они совпадают хотя бы в одной из других строк.Выключите OR для AND, если вам нужно, чтобы все таблицы имели совпадение.

select dc.STATUSWORK "DC STATUS"
   , de.STATUSWORK "DE STATUS"
   , r.STATUSWORK "R STATUS"
   , g.STATUSWORK "G STATUS"
   , c.STATUSWORK "CONTRACT Status", c.PYID 
from CONTRACT c
   left join VDC dc on (dc.COVERKEY = c.KEY)
   left join VDE de on (de.COVERKEY = c.KEY)
   left join RCK r on (r.COVERKEY = c.KEY)
   left join GDE g on (g.COVERKEY = c.KEY)
   left join CDOC c on (c.COVERKEY = c.KEY)
where c.PYID = 'C-1000'
and (
       exists (Select 1 from VDE where COVERKEY = c.KEY)
       or
       exists (Select 1 from VDC where COVERKEY = c.KEY)
       or
       exists (Select 1 from RCK where COVERKEY = c.KEY)
       or
       exists (Select 1 from GDE where COVERKEY = c.KEY)
       or
       exists (Select 1 from CDOC where COVERKEY = c.KEY)
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...