SQL自然连接POSTGRES

SQL自然连接POSTGRES,sql,postgresql,join,inner-join,natural-join,Sql,Postgresql,Join,Inner Join,Natural Join,我不确定我需要什么样的联接,因为我不熟悉以这种方式尝试重叠数据,或者它是否可行 我有两个表,它们共享一组相似的数据,并且都通过Room\u id与第三个父表相关。 我有一个名为Room_rates的表,它存储每个房间的平均价格(Room_id) 还有一个名为Availables的表,其中包含特定日期的费率 +--------+-------+-------+------------+---------+---------------------------+-------------------

我不确定我需要什么样的联接,因为我不熟悉以这种方式尝试重叠数据,或者它是否可行

我有两个表,它们共享一组相似的数据,并且都通过
Room\u id与第三个父表相关。

我有一个名为Room_rates的表,它存储每个房间的平均价格(Room_id)

还有一个名为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      |
+--------+-------+-------+------------+---------+---------------------------+---------------------------+--------+
目前我使用的是两个单独的搜索结果,一个是特定日期范围的当前可用数据,另一个是不可用数据。如果没有,我只使用
Room\u rate
平均值进行备份查询

我想在有可用价格的地方使用Availables,但如果价格不可用或可能根本没有记录,我会以某种方式加入Room_rates来填补空白


我怎样才能做到这一点呢?

这不是连接的情况。联接将表中的数据与另一个表中的数据进行匹配。例如,要匹配房间和房间价格,可以使用联接。但您不想匹配可用房价和房价。您想从Available中获取房价,如果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]
但我并不建议这样做,因为即使不需要,第二个“select”也会运行。因此,最好只在需要时运行第一次选择,然后再运行第二次选择。

该功能可以与连接结合起来,为您提供所需:

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
)来查看该联接是否值得

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]