Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите решить рационально несложную задачу  [new]
MaxJk
Member

Откуда:
Сообщений: 3
Здравствуйте, на тесте был такой вопрос-задачка t-sql. Мой ответ набрал крайне мало баллов .
Интересно просто для себя, как решить данную задачу наиболее правильно, эффективнее.

Задача: Найти такие значения @Свойства.Лицевой, для которых выполняется условие
фильтра по параметрам:
Все комбинации Параметр/Значение, содержащиеся в наборе @filter обязательно
присутствуют на таких лицевых. Наличие других параметров или других значений для
указанных параметров не имеет значения.


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);


Смысл просто найти счета по маскам из другой таблицы



--------
Мои варианты :
1)
SELECT  sv.Лицевой from @Свойства sv  
JOIN @filter f ON sv.Параметр=f.Параметр AND  sv.Значение=f.Значение 
GROUP BY sv.Лицевой
2)
Select sv.Лицевой from @Свойства sv, @filter f 
where sv.Значение=f.Значение and sv.Параметр=f.Параметр
GROUP BY sv.Лицевой

3) самый безбожный
 Select sv.Лицевой from @Свойства sv  where 
  sv.Параметр =  SOME ( Select f.Параметр from @filter f  )
 AND 
   sv.Значение =  SOME ( Select f.Значение from @filter f  )
   GROUP BY sv.Лицевой
31 мар 19, 15:11    [21848276]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить рационально несложную задачу  [new]
invm
Member

Откуда: Москва
Сообщений: 9345
MaxJk,

Читайте про реляционное деление.
31 мар 19, 15:14    [21848277]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить рационально несложную задачу  [new]
MaxJk
Member

Откуда:
Сообщений: 3
invm, спасибо, почитаю. пока что то туго понимаю, примеров не так много и с одним столбцом , а тут 2 штуки. реляционного деления нет в tsql вижу.
Уже даже сомневаюсь, что правильно понял задание. Если как понял нужно получить номера лицевых 1 и 2 т.к. (1,1,5) (2,1,5) (2,2,7) соответствуют маске {1, 5} {2, 7}.
А это операция больше напоминает пересечение INTERSECT но не оно конечно
31 мар 19, 16:35    [21848308]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить рационально несложную задачу  [new]
invm
Member

Откуда: Москва
Сообщений: 9345
select
 a.Лицевой
from
 (select distinct Лицевой from @Свойства) a
where
 not exists(
  select Параметр, Значение from @filter
  except
  select Параметр, Значение from @Свойства where Лицевой = a.Лицевой
 );
31 мар 19, 17:07    [21848313]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить рационально несложную задачу  [new]
MaxJk
Member

Откуда:
Сообщений: 3
invm,
Спасибо большое. И задание не правильно прочитал в итоге. действительно деление "Все комбинации присутствуют "
31 мар 19, 17:16    [21848318]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить