От: | Kaifa | ||
Дата: | 18.03.18 04:32 | ||
Оценка: |
Даны 2 набора данных вида:
DECLARE @Свойства TABLE (Лицевой INT, Параметр INT, Значение INT); INSERT INTO @Свойства VALUES (1,1,1) ,(1,2,1) ,(1,1,5) ,(2,1,1) ,(2,1,5) ,(2,2,7); DECLARE @filter TABLE (Параметр INT,Значение INT) INSERT INTO @filter VALUES (1,5),(2,7);
Задача: Найти такие значения @Свойства.Лицевой, для которых выполняется условие фильтра по параметрам:
Все комбинации Параметр/Значение, содержащиеся в наборе @filter обязательно присутствуют на таких лицевых. Наличие других параметров или других значений для указанных параметров не имеет значения.
[sql]
select
sv.Лицевой
from (
select distinct Лицевой, Параметр, Значение from @Свойства
) sv
join (
select distinct
f.Параметр as par,
f.Значение as val
from @filter f
) s on s.par = sv.Параметр and s.val = sv.Значение
group by sv.Лицевой
having count(1) = (
select count(1) from (
select count(1) cnt from @filter
group by Параметр, Значение
) s )
DECLARE @СвойстваUq TABLE (Лицевой INT, Параметр INT, Значение INT)
insert into @СвойстваUq(Лицевой, Параметр, Значение)
select distinct Лицевой, Параметр, Значение from @Свойства
DECLARE @filterUq TABLE (Параметр INT,Значение INT)
insert into @filterUq
select distinct Параметр, Значение from @filter
declare @filterCnt int
select @filterCnt = count(1) from @filterUq
select
sv.Лицевой
from @СвойстваUq sv
join @filterUq f on f.Значение = sv.Значение and f.Параметр = sv.Параметр
group by sv.Лицевой
having count(1) = @filterCnt