2010-02-25 47 views
2

我不确定我需要什么类型的连接,因为我不熟悉尝试以这种方式覆盖数据或者如果它是可行的。SQL自然连接POSTGRES

我有两个表这两者有着相似的一组数据,并且两者都涉及到3号的父表通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  | 
+--------+-------+-------+------------+---------+---------------------------+---------------------------+--------+ 

率目前我使用两个单独的海rch结果,当前为Availables特定日期范围内的数据存在,或者不存在。如果没有,我只使用Room_rate平均值进行备份查询。

我想使用可用的地方它有可用的价格,但不知何故加入Room_rates填补空白,如果价格不可用或可能根本没有记录。

我怎么能做到这一点?

回答

2

这不是加入的情况。连接会将表中的数据与另一个表中的数据进行匹配。例如,对于匹配房间和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] 

但我不会真的建议,因为第二个“中选择”将即使不需要运行。因此,最好只在需要时运行第一次选择,然后再执行第二次选择。

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)进行比较,以查看联接是否值得。