【问题标题】:SQL Query with one to many left join exclude any not existing具有一对多左连接的 SQL 查询排除任何不存在的
【发布时间】:2019-10-07 19:23:49
【问题描述】:

我想运行 sql 查询,为我带来两个日期之间没有吃任何蛋糕的孩子。 2 表:

* Child 
  - id, name

* Cake
  - child_id, eat_timestamp

一个孩子(安迪)吃了 2​​ 个蛋糕:10.01.2019 和 11.01.2019

我想在 09.01.2019 - 10.01.2019 之间进行搜索。 所以 Andy 不应该出现在列表中,但是由于 left join,它会显示他,因为它匹配第二个日期(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' 
                  )
)

【问题讨论】:

  • 是 MySQL 还是 PostgreSQL?
  • PostgreSQL 但我猜这个解决方案也适用于 MySQL
  • 请添加一些示例数据和预期输出

标签: mysql postgresql jpa


【解决方案1】:
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
;

【讨论】:

    【解决方案2】:

    你可以用 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'
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-21
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-28
      • 1970-01-01
      相关资源
      最近更新 更多