покритикуйте запрос
От: 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.