我不确定我需要什么样的联接,因为我不熟悉尝试以这种方式重叠数据,或者它是否可行。
我有两个表,它们共享一组相似的数据,并且都通过Room_id.
我有一个名为Room_rates的表格,用于存储每个房间的平均价格(room_id)
+-------+---------+-----------+-------+--------+---------------------------+---------------------------+
| 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 |
+-------+---------+-----------+-------+--------+---------------------------+---------------------------+
还有一个名为可用的表,其具有特定日期的费率
+--------+-------+-------+------------+---------+---------------------------+---------------------------+--------+
| 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
数据,或者不存在。如果不是,我只使用Room_rate
平均值进行备份查询。
我想在可用价格的情况下使用可用商品,但如果价格不可用或可能没有任何记录,我会以某种方式加入Room_rates来填空。
我怎么能做到这一点?
答案 0 :(得分: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]
您需要在相应列上使用索引才能实现此目标。您还需要compare the execution plan针对替代方案(例如Bruno建议的UNION
)的{{3}}来查看连接是否值得。
答案 1 :(得分:2)
连接不是这种情况。连接将匹配表中的数据与另一个表中的数据。例如,对于匹配room和room_rates,您将使用连接。但是你不想匹配Available和Room_rates。您希望从可用房间获得房价,或者 - 如果没有在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]
但我不建议这样做,因为即使不需要,第二个“选择”也会运行。因此,最好只在需要时运行第一个选择,然后运行第二个选择。