SQL-запрос с одним-многими левым соединением исключает любые несуществующие - PullRequest
0 голосов
/ 21 мая 2019

Я хотел бы запустить SQL-запрос, который приносит мне детей, которые не ели торт между двумя датами.2 таблицы:

* Child 
  - id, name

* Cake
  - child_id, eat_timestamp

Один ребенок (Энди) съел 2 торта: 10.01.2019 и 11.01.2019

И я хотел бы искать между 09.01.2019 - 10.01.2019.Так что Энди не должен появляться в списке, но из-за левого соединения он будет отображаться, потому что он соответствует второй дате (11.01.2019)

select * from children c LEFT JOIN
      public.cake cake 
      ON ((cake.child_id = c.id) 
      AND 
      (
          0 = 
         (
            SELECT
               COUNT(cake2.id) 
            FROM
               public.customer t13,
               public.cake cake2 
            WHERE
               (
((cake2.child_id = t13.id) 
                  AND 
                  (
                     cake2.time_planned >= '2019-01-09 00:00:00.0' 
                  )
) 
                  AND 
                  (
                     cake2.time_planned <= '2019-01-10 23:59:59.999' 
                  )
)

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Вы можете сделать это с NOT EXISTS:

select c.* from children c
where not exists (
  select 1 from cake
  where 
    child_id = c.id 
    and 
    eat_timestamp between '2019-01-09 00:00:00.0' and '2019-01-10 00:00:00.0'
)
1 голос
/ 21 мая 2019
SELECT c.*
FROM child c
INNER JOIN (
  SELECT DISTINCT child_id
  FROM cake c
  WHERE eat_timestamp NOT BETWEEN '2019-01-09' AND '2019-01-11'
) ck ON c.id = ck.child_id
;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...