SQL-сервер [присоединение к запросу + несколько условий] - PullRequest
0 голосов
/ 26 марта 2012

SQL сервер 2008

Hello

вот мой запрос, который возвращает результат

SELECT * FROM Rooms
WHERE RoomID in 
(SELECT t1.RoomId FROM 
(Rooms t1 INNER JOIN 
(SELECT RoomID, SUM(quantity) AS QTY FROM Room_Item GROUP BY RoomID
HAVING SUM(Quantity) = 0) t2 ON t1.RoomID = t2.RoomID))

выше письменный запрос вернет мне номер комнаты, в которой нет предметов (количество = 0), но теперь я хочу отфильтровать результат по зданиям,

я получил список комнат для конкретного здания, как показано ниже

select roomid from rooms where buildingblockid in (select buidingblockid from buildingblock where buildigID = 1)

поэтому мой запрос будет

вернуть идентификатор комнаты из таблицы комнат, где выделено элементов 0 и отфильтровать комнату по номеру здания = 1

структура таблиц такая, как показано ниже - показаны только основные поля

rooms => roomid(PK), buildingblockID(FK), roomname
room_item => roomitemid(PK), roomid(FK), itemid(FK), quantity
item => itemid(PK), itemname
buildingblock => buildingblockid(PK), buildingID(FK)
building => buildingID(PK), buildingName

1 Ответ

1 голос
/ 26 марта 2012

Вы можете создать производную таблицу, чтобы найти комнаты без предметов, и присоединить ее к buildingWiseRoom, чтобы отфильтровать здание.

select buildingWiseRoom.roomID
from buildingWiseRoom
inner join
(
   select RoomID
     from Room_Item 
    group by RoomID 
   having SUM(Quantity) = 0
) itemlessRooms
  on buildingWiseRoom.roomID = itemlessRooms.roomID
where buildingWiseRoom.buildingID = 1

ОБНОВЛЕНИЕ при изменении структуры таблицы:

select rooms.roomID
from rooms
inner join buildingblock 
   on rooms.buildingblockID = buildingblock.buildingblockID
inner join
(
   select RoomID
     from Room_Item 
    group by RoomID 
   having SUM(Quantity) = 0
) itemlessRooms
  on rooms.roomID = itemlessRooms.roomID
where buildingblock.buildingID = 1
...