Это даст вам идентификаторы из @T, которые уже имеют комбинацию значений, предоставленных в @ NewValues.
declare @T table (ID int, Value char(1))
insert into @T values
(1, 'A'),(2, 'B'),(3, 'C'),(3, 'C'),
(4, 'A'),(4, 'D'),(5, 'A'),(5, 'C'),
(5, 'D')
declare @NewValues table(ID int, Value char(1))
insert into @NewValues values (6, 'A'), (6, 'D')
select T.ID
from @T as T
inner join @NewValues as N
on T.Value = N.Value
group by T.ID
having count(*) = (select count(*) from @NewValues)
Результат:
ID
4
5
Если вам нужны только точные совпаденияЭто означает, что ID = 5 не будет возвращено, потому что он также имеет одну строку со значением = 'C', вы можете использовать это вместо этого.
select T.ID
from @T as T
left outer join @NewValues as N
on T.Value = N.Value
group by T.ID
having count(N.Value) = (select count(*) from @NewValues) and
count(*) = (select count(*) from @NewValues)
Я вижу, что у вас есть (3, 'C') и(3, 'C') в вашей таблице.Если вы хотите обнаружить это с помощью ввода (6, 'C') и (6, 'C'), вам нужен этот запрос.
select T.ID
from @T as T
left outer join (select distinct Value
from @NewValues) as N
on T.Value = N.Value
group by T.ID
having count(N.Value) = (select count(*) from @NewValues) and
count(*) = (select count(*) from @NewValues)
Заполните `@NewValues?таблица с функцией разделения строк.
-- Paramenter to SP
declare @ParamID int = 6
declare @ParamValues varchar(100) = 'A,D'
declare @NewValues table(ID int, Value char(1))
insert into @NewValues
select @ParamID, s
from dbo.Split(',', @ParamValues)