POSTGRESQL: используйте EXCEPT в каждом GROUP BY - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть следующие таблицы:

CREATE TABLE rqrd  
(p_id INTEGER, 
co_id INTEGER);

INSERT INTO rqrd VALUES 
    (1, 100), 
    (1, 800), 
    (2, 100),
    (2, 800), 
    (3, 100), 
    (3, 800), 
    (3, 900);



CREATE TABLE completed  
(p_id INTEGER, 
co_id INTEGER);

INSERT INTO completed VALUES 
    (1, 100), 
    (1, 800), 
    (2, 100),
    (3, 100), 
    (3, 800), 
    (3, 900);

Как можно вернуть строки из completed в случае, если в каждой группе p_id в rqrd больше нет строк для этого p_id (достаточно запутанно !!) Я имею в виду, я хочу:

(1, 100), 
(1, 800)

и

(3, 100), 
(3, 800), 
(3, 900);

из completed, чтобы показать в результате, потому что больше нет строк для p_id = 1или 3 в rqrd.Но (2, 100) не приходит в результате, потому что у нас есть:

(2, 800),

в таблице rqrd.

1 Ответ

0 голосов
/ 22 сентября 2018

Не уверен, что я полностью понимаю вопрос, но может быть что-то вроде этого:

select *
  from completed
  where p_id not in (

     select r.p_id
       from rqrd r
       left join completed c on (c.p_id = r.p_id and c.co_id = r.co_id)
       where c.p_id is null

  )
;

Подзапрос просматривает все rqrd записи p_id, co_id и ищет такие пары, которые не существуютв completed.Если такой комбинации не существует, то p_id недопустимо, и все такие записи p_id отфильтровываются из запроса completed.

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