【问题标题】:Query Between to dates not collecting correct rows查询未收集到正确行的日期之间
【发布时间】:2013-01-08 03:36:43
【问题描述】:

在下面的查询中,我的原始 ERD 中有 5 个表。该查询旨在从 Homes 表中选择家,并从相应的表中选择其特征和类型。我遇到的问题是在输入查询的特定日期范围之间选择预订表中不存在的房屋。

 Bookings  >--  Home  >--  Home_Type
                  |
                  ^
            Home_Feature
                  V
                  |
               Feature


SELECT homes.home_id, 
    homes.title, 
    homes.description, 
    homes.living_room_count, 
    homes.bedroom_count, 
    homes.bathroom_count, 
    homes.price, homes.sqft,
    listagg(features.feature_name, '\n') WITHIN GROUP(ORDER BY features.feature_name) features, 
    home_type.type_name
FROM homes
INNER JOIN home_feature 
  ON homes.home_id = home_feature.home_id
INNER JOIN home_type 
  ON home_type.type_code = homes.type_code
INNER JOIN features 
  ON home_feature.feature_id = features.feature_id
WHERE NOT EXISTS (SELECT home_id
                  FROM bookings b
                  WHERE b.home_id = homes.home_id 
                  AND (b.booking_end <= to_date('25-Jan-13') OR b.booking_end >= to_date('21-Jan-13'))
                  AND (b.booking_start <= to_date('25-Jan-13') OR b.booking_start >= to_date('21-Jan-13')))
GROUP BY homes.home_id, homes.title, 
    homes.description, homes.living_room_count, 
    homes.bedroom_count, homes.bathroom_count, 
    homes.price, homes.sqft, home_type.type_name

现在我的查询似乎没有正确获取正确的行。下面是一个示例输出以及当前在 bookings 表中的内容,您可以看到返回的行不正确。

输出:

Home_ID    Title    Description    LivingRooms    Bedrooms    Bathrooms    Price    SQFT    Type    Features
3          Home A   A House        2              2           2            200      500     Flat    TV...
4          Home B   B House        3              1           1            250      600     House   Pool...

预订表:

Home_ID    Booking_ID    Customer_ID    Booking_Start    Booking_End
1          1             1              22-Jan-13        23-Jan-13
2          2             3              27-Jan-13        29-Jan-13

家庭表:

Home_ID    ....
1          ....
2
3           
4

显然,此时查询的输出也应该包括 Home_ID 2 但不是,但我的印象是查询应该可以工作?

此时的查询应该如下所示:

Home_ID    Title    Description    LivingRooms    Bedrooms    Bathrooms    Price    SQFT    Type    Features
2          Home 2   2 House        3              1           1            100      300     Flat    Balcony...
3          Home 3   3 House        2              2           2            200      500     Flat    TV...
4          Home 4   4 House        3              1           1            250      600     House   Pool...

谁能帮我修改查询以使其正常工作并包含正确的行?

【问题讨论】:

  • home_feature 中是否有 home_id 2 的行?如果没有,内部连接将在 WHERE 子句有机会之前排除该 id。此外,子查询中的 WHERE 子句 WHERE b.home_id = homes.home_id 可能 not 执行您认为它正在执行的操作。测试没有那个 WHERE 子句。
  • 是的,Home_Feature 中有几行 Home_ID 2
  • @user1851487,也许您应该关心先创建表和数据并发布它?

标签: sql oracle join oracle11g


【解决方案1】:

我想你想要一个left outer join 而不是where not exists

试试这个:

...
INNER JOIN features 
  ON home_feature.feature_id = features.feature_id
left outer join bookings b
  on homes.home_id = b.home_id
where (
        (b.booking_end <= to_date('25-Jan-13')
         OR b.booking_end >= to_date('21-Jan-13')
        )
        AND
        (b.booking_start <= to_date('25-Jan-13')
         OR b.booking_start >= to_date('21-Jan-13')
        )
      )
      or b.home_id is null
...

这将返回未预订的房屋 (or b.home_id is null) 和预订符合您条件的房屋。

现在应该返回所有四个家。

【讨论】:

  • 您好,感谢您的回复。但是 home_id 1 不应该出现在查询结果中,因为它在这两个日期之间被预订了。
  • @user1851487:在这种情况下,您的 where 条件是错误的。第一部分说:“结束日期必须小于 25/1/13 或大于 21/1/13”。您的结束日期是 23/1/13,它满足两个条件:大于 21/1/13 和小于 25/1/13。第二部分说:“开始日期必须小于 25/1/13 或大于 21/1/13”。您的开始日期是 22/1/13,再次满足这两个条件。我认为您需要以下条件:结束日期应小于 21/1/13 或开始日期应大于 25/1/13
  • 谢谢,我按照建议更改了 where 条件并修复了它。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-22
相关资源
最近更新 更多