У меня есть отдельные группы «классы» и «группы», каждому из которых присваивается один или несколько тегов. Я хотел бы найти для каждой группы подмножество классов, которое содержит те же (или более) теги для каждой группы.SQL найти наборы с общими членами (реляционное деление)
Некоторые образцы данных:
declare @Groups table
(
GroupID int,
TagID int
)
insert @Groups
values (1,1),(1,2),(1,3),
(2,1),(2,2),
(3,1),(3,2),(3,3),(3,4)
declare @Classes table
(
ClassID int,
TagID int
)
insert @Classes
values (1,1),(1,2),
(2,1),(2,2),
(3,1),(3,2),(3,3)
select * from @Groups
select * from @Classes
И выход:
GroupID TagID
1 1
1 2
1 3
2 1
2 2
3 1
3 2
3 3
3 4
ClassID TagID
1 1
1 2
2 1
2 2
3 1
3 2
3 3
Пример результирующего набора будет выглядеть следующим образом:
declare @Results table
(
GroupID int,
ClassID int
)
insert @Results
values (1,3),(2,1),(2,2),(2,3),(3,null)
select * from @Results
Результаты Выход:
GroupID ClassID
1 3
2 1
2 2
2 3
3 NULL
Я понимаю, что это проблема типа реляционного деления, включающая having
и count
. Эти сообщения описывают то, что я хочу сделать, но я не могу понять, как применить примеры конкретного случая выше:
- http://weblogs.sqlteam.com/peterl/archive/2010/07/02/Proper-Relational-Division-With-Sets.aspx
- SQL Join only if all records have a match
- How can I structure a query to give me only the rows that match ALL values in a CSV list of IDs in T-SQL
- SQL: select sets containing exactly given members
- An sql query to find users with common tags in a defined set
Добро пожаловать в SO! и +1 для получения метода двойного отрицания. Я попытался бы избежать этого в производственных средах, потому что это может быть довольно озадачивающим, если вы не знакомы с ним. – Andomar
Спасибо, помечены как ответ для корректного возврата null для пустых групп. – Tamar