2011-12-19 3 views
0

мне нужна помощь с запросом не объединения двух таблиц для общежития (общежитие) базы данных:Объединить две таблицы с группой

номера - номер ID, категория, аренда, нет мест, и т.д.

студент, живущий в общежитии - студент, живущий в общежитии 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 

Проблема заключается в том, где ваша оговорка за исключением записей из t_rooms, потому что нет никаких записей в t_hostelers. Чтобы исправить вам нужно применить фильтр к соединению, поэтому он применим только к t_hostelers ИЛИ включает результаты NULL в предложение where.

+0

На самом деле строки не устраняются из-за предложения WHERE. Это связано с тем, что в таблице T_Hosteler для всех строк таблицы T_Rooms не будут (или не нужны) строки. – gvm123

+0

Тогда вы можете предоставить некоторые примеры данных и ожидаемые результаты, поскольку я не понимаю проблему. – xQbert

+0

Я должен не согласиться с вашим комментарием: Скажем, у меня T_ROOM 1 без записи в T_Hosteler. Когда это осталось, 1 будет по-прежнему находиться в результирующем наборе. Однако, когда DBEngine применяет ваше предложение where, запись 1 будет удалена, потому что T_Hostler.H_status равен NULL, но не «активен», в результате любая комната без записи в t_Hostlers будет исключена (по предложению where). Это отрицает преимущество левого соединения. – xQbert