2

そのような方法でデータをオーバーラップしようとすることに慣れていないため、またはそれが実現可能であるかどうかに慣れていないため、どのような結合が必要かわかりません。

2 つのテーブルがあり、どちらも同様のデータ セットを共有し、両方とも 3 番目の親テーブルに関連しています。Room_id.

各部屋 (room_id) の平均価格を格納する Room_rates というテーブルがあります。

+-------+---------+-----------+-------+--------+---------------------------+---------------------------+
| id    | room_id | dayofweek | price | source | created_at                | updated_at                |
+-------+---------+-----------+-------+--------+---------------------------+---------------------------+
| 87936 | 2517    | 0         | 14.58 | 1      | 2010-02-22 17:47:14 +0100 | 2010-02-22 17:47:14 +0100 |
| 87937 | 2517    | 1         | 14.58 | 1      | 2010-02-22 17:47:14 +0100 | 2010-02-22 17:47:14 +0100 |
| 87938 | 2517    | 2         | 14.52 | 1      | 2010-02-22 17:47:14 +0100 | 2010-02-22 17:47:14 +0100 |
| 87939 | 2517    | 3         | 14.52 | 1      | 2010-02-22 17:47:14 +0100 | 2010-02-22 17:47:14 +0100 |
| 87940 | 2517    | 4         | 14.52 | 1      | 2010-02-22 17:47:15 +0100 | 2010-02-22 17:47:15 +0100 |
| 87941 | 2517    | 5         | 14.4  | 1      | 2010-02-22 17:47:15 +0100 | 2010-02-22 17:47:15 +0100 |
| 87942 | 2517    | 6         | 14.63 | 1      | 2010-02-22 17:47:15 +0100 | 2010-02-22 17:47:15 +0100 |
+-------+---------+-----------+-------+--------+---------------------------+---------------------------+

そして、特定の日付の料金を含む Availables というテーブル

+--------+-------+-------+------------+---------+---------------------------+---------------------------+--------+
| id     | price | spots | bookdate   | room_id | created_at                | updated_at                | source |
+--------+-------+-------+------------+---------+---------------------------+---------------------------+--------+
| 221389 | 14.3  | 1     | 2010-03-01 | 2517    | 2010-02-21 22:31:06 +0100 | 2010-02-21 22:31:06 +0100 | 1      |
| 221390 | 14.3  | 1     | 2010-03-02 | 2517    | 2010-02-21 22:31:06 +0100 | 2010-02-21 22:31:06 +0100 | 1      |
| 221391 | 14.3  | 1     | 2010-03-03 | 2517    | 2010-02-21 22:31:06 +0100 | 2010-02-21 22:31:06 +0100 | 1      |
| 221392 | 14.3  | 1     | 2010-03-04 | 2517    | 2010-02-21 22:31:06 +0100 | 2010-02-22 17:47:19 +0100 | 1      |
| 221393 |       | 0     | 2010-03-05 | 2517    | 2010-02-21 22:31:06 +0100 | 2010-02-22 17:47:19 +0100 | 1      |
| 221394 |       | 0     | 2010-03-06 | 2517    | 2010-02-21 22:31:06 +0100 | 2010-02-22 17:47:19 +0100 | 1      |
| 228185 |       | 0     | 2010-03-07 | 2517    | 2010-02-22 17:47:19 +0100 | 2010-02-22 17:47:19 +0100 | 1      |
| 228186 | 14.3  | 1     | 2010-03-08 | 2517    | 2010-02-22 17:47:19 +0100 | 2010-02-22 17:47:19 +0100 | 1      |
| 228187 | 14.3  | 1     | 2010-03-09 | 2517    | 2010-02-22 17:47:19 +0100 | 2010-02-22 17:47:19 +0100 | 1      |
| 228188 | 14.3  | 1     | 2010-03-10 | 2517    | 2010-02-22 17:47:19 +0100 | 2010-02-22 17:47:19 +0100 | 1      |
+--------+-------+-------+------------+---------+---------------------------+---------------------------+--------+

Availables現在、特定の日付範囲の現在のデータが存在するか、存在しないかの 2 つの個別の検索結果を使用しています。そうでない場合は、Room_rate平均のみを使用してバックアップ クエリを使用します。

利用可能な価格がある場合は Availables を使用したいと思いますが、価格が利用できない場合、またはレコードがまったくない場合は、Room_rates に参加して空白を埋めます。

どうすればこれを達成できますか?

4

2 に答える 2

4

COALESCE関数を結合と組み合わせて、必要なものを提供できます。

SELECT COALESCE(a.price, rr.price) 
  FROM Availables AS a
  FULL OUTER JOIN room_rates AS rr
    ON a.room_id = rr.room_id
  WHERE a.room_id=[id]
    AND a.bookdate=[date]
    AND rr.dayofweek=[dayofweek]

これを実行するには、適切な列にインデックスが必要です。また、このステートメントの実行計画を代替案 (Bruno が提案したものなど) と比較してUNION、結合が価値があるかどうかを確認する必要もあります。

于 2010-02-25T14:05:37.343 に答える
2

これは、結合には当てはまりません。結合は、テーブルのデータを別のテーブルのデータと照合します。たとえば、roomとroom_ratesを一致させるには、結合を使用します。ただし、AvailableとRoom_ratesを一致させたくありません。レートをAvailableから取得するか、Avaiableに見つからない場合はRoom_ratesから取得します。

したがって、実際には、最初にAvailableでクエリを実行し、次に必要に応じてRoom_ratesでクエリを実行する必要があります。

次のようなクエリによって返される最初の結果を取得できます。

select price from Availables where room_id=[id] and bookdate=[date]
union
select price from room_rates where room_id=[id] and dayofweek=[day of week]

ただし、2番目の「選択」は不要な場合でも実行されるため、実際にはお勧めしません。したがって、必要な場合にのみ、最初の選択を実行してから2番目の選択を実行することをお勧めします。

于 2010-02-25T13:50:53.720 に答える