2011-12-19 54 views
0

我需要一个查询连接两个表的宿舍(宿舍)数据库帮助:加入两个表组

房间 - 房间ID,类别,租金,没有床,等

旅馆主人 - 旅馆主人身份证,姓名,房间号等

我需要生成一个结果集给所有的房间,总床数没有和占用没有。床和床的免费无等

这里是我使用的查询:

SELECT r.R_ID , r.R_Beds, count(h.h_id), (r.r_beds-count(h.h_id)) , 
if((r.r_beds-count(h.h_id))>0, 'Available', 'Full') , r.r_rent 
FROM T_Rooms r LEFT OUTER JOIN t_hostelers h 
ON r.r_id = h.h_roomno 
WHERE h.h_status= 'active' 
GROUP BY h.h_roomno 

但我只得到从房间表,该表在hostelers表中的值的行。我需要显示其他没有占用的房间。

请帮我找出我的疏忽或错误。

回答

0

选项1个

SELECT r.R_ID , r.R_Beds, count(h.h_id), (r.r_beds-count(h.h_id)) , 
if((r.r_beds-count(h.h_id))>0, 'Available', 'Full') , r.r_rent 
FROM T_Rooms r 
LEFT OUTER JOIN t_hostelers h 
    ON r.r_id = h.h_roomno 
    AND h.h_status= 'active' 
GROUP BY h.h_roomno 

选项2

SELECT r.R_ID , r.R_Beds, count(h.h_id), (r.r_beds-count(h.h_id)) , 
if((r.r_beds-count(h.h_id))>0, 'Available', 'Full') , r.r_rent 
FROM T_Rooms r 
LEFT OUTER JOIN t_hostelers h 
    ON r.r_id = h.h_roomno 
WHERE 
    (h.h_status= 'active' or H.H_Status is null) 
GROUP BY h.h_roomno 

的问题是你的where子句从t_rooms排除记录,因为在t_hostelers没有记录。为了更正,您需要将过滤器应用于连接,因此它仅适用于t_hostelers或将NULL结果包含在where子句中。

+0

实际上,由于WHERE子句,行没有被消除。这是因为T_Rooms表中所有行的T_Hosteler表中不会有(或不需要)行。 – gvm123 2011-12-19 21:54:36

+0

那么你能否提供一些样本数据和预期结果,因为我不明白这个问题。 – xQbert 2011-12-19 22:12:55

+0

我必须不同意你的评论:假设我在T_Hosteler中有没有记录的T_ROOM 1。当这是左连接时,1仍然在结果集中。但是,当DBEngine应用where子句时,记录1将被删除,因为T_Hostler.H_status等于NULL而不是'active',因此t_Hostlers中没有记录的任何房间将被排除(由where子句排除)。这否定了左连接的好处。 – xQbert 2011-12-20 12:11:50