sql - 如何运行有条件地使用连接的连接查询

标签 sql postgresql

我有以下架构:

Freelancers
===========
Id

Availabilities
===========
Date
available (bool)
freelancer_id

GeneralAvailabilities
===========
Date
available (bool)
freelancer_id

我希望获得在给定日期有空的所有自由职业者。如果满足以下任一条件,则可以成为自由职业者

  1. 他们没有 AvailabilityGeneralAvailability在那一天
  2. 他们有一个 GeneralAvailability在那个有 available 的日期设置为真
  3. 他们有一个 Availability在那个有 available 的日期设置为真。

如果他们有一个 Availability设置为 false 但 GeneralAvailability设置为真,自由职业者可用,如果 availabile Availability 的值设置为真。

换句话说,要查看自由职业者在给定日期是否有空,请检查 Availability 的 bool 值对于那个日期,如果没有 Availability对于那个日期,检查 GeneralAvailability 的 bool 值那个日期。如果没有AvailabilityGeneralAvailability在该日期,它们默认可用。

到目前为止,我的 SQL WHERE 语句如下:

WHERE (
  ( availabilities.id IS NULL )
  OR NOT (
    availabilities.date = ?
    AND
    availabilities.available = false
  )
) OR (
  ( general_availabilities.id IS NULL )
  OR NOT (
    general_availabilities.weekday = ?
    AND
    general_availabilities.available = false
  )
)

这适用于大多数情况,除非存在 Availability。那是错误的,并且是 GeneralAvailability那是真实的。在这种情况下不应返回自由职业者,因为 Availability应该取代 GeneralAvailability并且只求助于 GeneralAvailability如果没有Availability那个日期。

希望这是有道理的!非常感谢您花时间查看我的问题。

乔希

最佳答案

使用日期左连接到可用性表,然后在“有一个真实的”之前根据“没有成功连接”进行过滤

select
    freelancers.id
from
    freelancers
    left join availabilities on(
        availabilities.freelancer_id = freelancers.id
        and availabilities.date = '2017.09.28'::date
    )
    left join general_availabilities on(
        general_availabilities.freelancer_id = freelancers.id
        and general_availabilities.date = '2017.09.28'::date
    )
where
    (
        availabilities is null
        and general_availabilities is null
    )
    or availabilities.available = true
    or (
        availabilities is null
        and general_availabilities.available = true
    )

关于sql - 如何运行有条件地使用连接的连接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46469066/

相关文章:

mysql - 如何为 5/24 - 27/41 的日期创建此列? MySQL

postgresql - 使用新名称克隆 postgres 数据库

mysql - 如何汇总多个表的行大小

mySQL - 多行合并为一行

SQL 标识列

sql - 多个查询与单个查询(多个有多个连接)

postgresql - Vagrant + Docker + Postgresql - 无法从主机连接

postgresql 模式冲突

arrays - 如何将函数应用于 Postgres 中数组列的每个元素?

mysql - 我在哪里可以了解更高级的 ActiveRecord 查询?