这是我的SQL查询
SELECT
room.*, reservation.rn, reservation.cin
FROM
room, reservation
但它返回每行4个实例。
我只想从另一张桌子获得相应的预订,他们有同样的房间号码,同时显示其余的房间
标识,r_num,r_price,in_date,out_date
ID,r_num,CIN,COUT
答案 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
来区分结果