SQL查询返回多个结果

时间:2017-04-04 13:26:02

标签: sql

这是我的SQL查询

SELECT 
    room.*, reservation.rn, reservation.cin 
FROM 
    room, reservation

但它返回每行4个实例。

我只想从另一张桌子获得相应的预订,他们有同样的房间号码,同时显示其余的房间

房间表

标识,r_num,r_price,in_date,out_date

reservation_table

ID,r_num,CIN,COUT

3 个答案:

答案 0 :(得分:1)

您的select语句会产生交叉加入/笛卡尔积。

使用WHERE子句!

SELECT room.*,reservation.rn,reservation.cin FROM room,reservation WHERE room.room_no = reservation.room_no

对于更复杂的连接,我建议使用带有相应关键字的显式语法,尽管您的隐式连接对于这种情况非常好(并且性能明智的隐式连接和显式连接是相同的)。

为了显示未保留的房间(为了保持不满足where子句的结果),你必须使用OUTER JOIN(左或右取决于你想要保留的内容),如下所示:< / p>

SELECT room.*,reservation.rn,reservation.cin 
FROM room LEFT OUTER JOIN reservation 
ON room.room_no = reservation.room_no

答案 1 :(得分:1)

由于没有连接条件,因此两个表之间存在交叉连接。

假设预订表的room_id FK引用了房间表中的id,您可以像这样加入:

select r.*,
    s.rn,
    s.cin
from room r
join reservation s on r.id = s.room_id

始终使用正确的显式连接语法而不是基于逗号的连接。

答案 2 :(得分:0)

对于第一部分,您需要加入,对于第二部分,您需要结合:

select r.Id,r.r_num,r.r_price,r.in_date,r.out_date,s.id as resId,s.r_num,s.cIn,s.cOut
   from room r
join reservation s on r. r_num = s. r_num
  union 
select r.Id,r.r_num,r.r_price,r.in_date,r.out_date,null as resId, null as r_num, null as cIn,null as cOut
  from room r
where r.in_date is null

默认情况下,如果需要重复的行,则使用UNION ALL

来区分结果