Предполагая SQL Server, вот рабочий пример с JOIN, который должен работать лучше, чем предложения IN, которые вы используете, если у вас правильно установлены первичный и внешний ключи. Я построил объединенные 5 подходов в 3 группы, но наборы 4 и 5 не являются частью группы 3 и не будут отображаться в ответе. Однако этот запрос не масштабируется (например, поиск в группе 4, 5, 7, 8 и 13 потребует модификации кода, если вы не проанализируете входные параметры в табличной переменной)
set nocount on
declare @sets table
(
Id INT Identity (1, 1),
Column1 VarChar (50),
Column2 VarChar (50)
)
declare @Set_Has_Group table
(
Set_Id Int,
Group_Id Int
)
insert into @sets values (newid(), newid())
insert into @sets values (newid(), newid())
insert into @sets values (newid(), newid())
insert into @sets values (newid(), newid())
insert into @sets values (newid(), newid())
update @sets set column1 = 'Column1 at Row ' + Convert (varchar, id)
update @sets set column2 = 'Column2 at Row ' + Convert (varchar, id)
insert into @Set_Has_Group values (1, 1)
insert into @Set_Has_Group values (1, 2)
insert into @Set_Has_Group values (1, 3)
insert into @Set_Has_Group values (2, 1)
insert into @Set_Has_Group values (2, 2)
insert into @Set_Has_Group values (2, 3)
insert into @Set_Has_Group values (3, 1)
insert into @Set_Has_Group values (3, 2)
insert into @Set_Has_Group values (3, 3)
insert into @Set_Has_Group values (4, 1)
insert into @Set_Has_Group values (4, 2)
insert into @Set_Has_Group values (5, 1)
insert into @Set_Has_Group values (5, 2)
/* your query with IN */
SELECT column1, column2 FROM @sets WHERE
id IN(SELECT set_id FROM @set_has_group WHERE group_id = 1)
AND id IN(SELECT set_id FROM @set_has_group WHERE group_id = 2)
AND id IN(SELECT set_id FROM @set_has_group WHERE group_id = 3)
/* my query with JOIN */
SELECT * -- Column1, Column2
FROM @sets sets
WHERE 3 = (
SELECT Count (1)
FROM @Set_Has_Group Set_Has_Group
WHERE 1=1
AND sets.Id = Set_Has_Group.Set_Id
AND Set_Has_Group.Group_ID IN (1, 2, 3)
Group by Set_Id
)