【问题标题】:How to set a Where clause on the top (parent) level in PostgreSQL?如何在 PostgreSQL 的顶级(父)级别设置 Where 子句?
【发布时间】:2021-12-14 14:03:17
【问题描述】:

我对 PostgreSQL 比较陌生。

我的问题是我有预订的公寓,我需要选择给定范围内可用(没有预订)的公寓。

Reservations 表包含字段 apartmentId(引用 Apartments 表)、userId 和 datesReserved,即tstzrange

出于这些目的,我正在做这个查询:

SELECT * FROM apartments 
JOIN appointments ON appointments.aparmentId = apartments.id 
WHERE NOT(datesreserved && '[2020-12-15T15:00:00.000Z, 2020-12-17T16:00:00.000Z)');

但相反,我得到了过滤的约会 - 那些不包含值 [2020-12-15T15:00:00.000Z, 2020-12-17T16:00:00.000Z)

据我研究,有顶级 where 和 inner-level,据我了解,这个查询应该给我顶级结果 - 那些 不包含提供的范围的公寓>.

在这种情况下我理解正确吗?

【问题讨论】:

  • 您的意思是contains 而不是overlaps?为了节省一些时间:您能否添加一个数据样本和确切的预期结果?
  • 嗨@JimJones!我需要更准确而不是包含的重叠。示例:公寓(id:1,地址:'5th ave'),Apartment(id:2,地址:'7th ave'),约会(id:1,apartmentId:1,datesReserved:'[2020-12-15T14: 00:00.000Z, 2020-12-20T12:00:00.000Z)'), 约会 (id: 2, apartmentId: 1, datesReserved: '[2021-12-15T14:00:00.000Z, 2021-12-20T12: 00:00.000Z)') 和约会(id: 3, apartmentId: 2, datesReserved: '[2020-12-15T14:00:00.000Z, 2020-12-20T12:00:00.000Z)')。因此,当我将 Where 指定为 NOT(datesReserved && ‘[2020-12-15T14:00:00.000Z, ...) 时,我希望什么也得不到
  • 由于两个公寓重叠,因此无法使用。但我得到的只是一个 id = 1 和约会.​​id = 2 的公寓。这意味着 postgres 过滤约会并给出那些不与指定值重叠的约会。但我需要过滤公寓,而不是约会。
  • 请在代码问题中给出minimal reproducible example--剪切&粘贴&可运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。对于 SQL 包括 DDL 和表格初始化代码。当你得到一个你不期望的结果时,暂停你的总体目标,切到第一个具有意外结果的子表达式并说出你的期望和原因,并通过文档证明是合理的。 How to AskHelp center通过编辑而不是 cmets 进行澄清。

标签: postgresql inner-join where-clause date-range


【解决方案1】:

我认为你不需要在这里存在。实际上,您没有“顶级”,表是对等的。

SELECT * FROM apartments WHERE NOT EXISTS (
    SELECT 1 from appointments WHERE appointments.aparmentId = apartments.id and datesreserved && '[2020-12-15T15:00:00.000Z, 2020-12-17T16:00:00.000Z)'
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2015-05-22
    • 1970-01-01
    • 2013-03-29
    • 2014-10-04
    • 1970-01-01
    相关资源
    最近更新 更多