У меня есть таблица, как это:

GroupID    Room
    10        A
    10        B
    10        C
    20        A
    20        C
    20        D
    30        A  
    30        B
    30        C

В 1-м столбце есть несколько групп, и им назначены комнаты. Таким образом, группе 10 назначены комнаты A, B, C.

Теперь я хочу найти группы, которым не хватает одной комнаты по сравнению с группой 10.

Таким образом, в приведенном выше примере он должен выбрать Group ID = 20 & Room = B. Как и в этом списке всех идентификаторов групп и отсутствующей комнаты.

Все, что я мог сделать, это

select GroupID, Count(*)
from GroupRooms
group by GroupID;

В настоящее время это только возвращает что-то вроде этого,

GroupID         Count(*)
  10              3
  20              3
  30              3
1
user5749114 20 Мар 2017 в 04:38

2 ответа

Лучший ответ

Вы можете сделать это, сгенерировав все строки для каждой группы для всех комнат в группе 10. Затем используйте left join, чтобы определить, какие действительно существуют:

select g.groupId, t10.room
from t t10 cross join
     (select distinct GroupId from t) g left join
     t     
     on t.groupId = g.groupId and t.room = t10.room 
where t10.GroupId = 10 and t.room is null; 
2
Gordon Linoff 20 Мар 2017 в 01:42
SELECT * FROM GroupRooms
Where GroupID <> 10 AND Room NOT IN (SELECT Room from GroupRooms where GroupID = 10)

Если я правильно понял ваш вопрос, это должно сработать. Найти все комнаты, не используемые другими идентификаторами и используемые Id = 10

1
Bennjoe Mordeno 20 Мар 2017 в 01:41