1

以下のクエリでは、粗い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

現在、私のクエリは正しい行を正しく取得していないようです。現時点での出力例と、現在予約テーブルにあるものを以下に示します。間違った行が返されていることがわかります。

出力:

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...

誰かがクエリを変更して正しく機能し、正しい行を含めるのを手伝ってもらえますか?

4

1 に答える 1

2

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これにより、予約のない家()と、条件に一致する予約のある家が返されます。

これで、4つの家すべてが返されます。

于 2013-01-24T11:45:05.807 に答える