2010-02-25 46 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)進行比較,以查看聯接是否值得。