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

Откуда:
Сообщений: 351
Добрый день!
Что-то не могу сообразить, как написать запрос на чистом SQL, без использования динамической сборки текста запроса, и возможно ли вообще.
Есть универсальное хранилище свойств объектов (объект, свойство, значение)
Необходимо отобрать по конкретным нескольким свойствам объекта этот объект. Но обязательно по условию "И", а не "ИЛИ".

Пример:
1) Есть Таблица ObjectProperty
object kind_property value_property
Колбаса Докторская Размер 30
Колбаса Докторская Оболочка Натуральная
Колбаса Столичная Размер 30
Колбаса Докторская Оболочка Искусственная
Колбаса Молочная Размер 20
Колбаса Молочная Оболочка Натуральная
Сосиски Молочные Упаковка вакуумная
Сосиски Молочные Оболочка Натуральная


2) Есть другая таблица MyProperty
kind_property value_property
Оболочка Натуральная
Размер 30


В этом случае должно вернуть: Колбаса Докторская.
Т.е. если бы свойства были не строками таблицы, а столбцами, то условие бы выглядело как:
select object
from ObjectProperty
where kind_property1 = Натуральная and kind_property2 = 30 and kind_propertyN = Что-то еще
15 мар 12, 23:48    [12257414]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с отбором по массиву свойств объекта  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Сорри, в исходных таблицах опечатка: в четвертой строке ObjectProperty не Докторская, а Столичная.
15 мар 12, 23:51    [12257432]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с отбором по массиву свойств объекта  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Что-то я туплю под вечер

select object
from ObjectProperty o
inner join MyProperty p
on o.kind_property = p.kind_property
and o.value_property = p.value_property
except
select object
from ObjectProperty o
inner join MyProperty p
on o.kind_property = p.kind_property
and o.value_property <> p.value_property

что-то типа такого, наверное. Надо на свежую голову подумать :)
16 мар 12, 00:11    [12257485]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с отбором по массиву свойств объекта  [new]
iljy
Member

Откуда:
Сообщений: 8711
Kateryne,

либо intersect, либо group by + count
16 мар 12, 00:19    [12257512]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с отбором по массиву свойств объекта  [new]
aleks2
Guest
iljy
Kateryne,

либо intersect, либо group by + count


not exists() лучче

select DISTINCT object
FROM ObjectProperty op
WHERE 
not exists(select * FROM MyProperty mp 
           left outer join 
           (select * FROM ObjectProperty op1 WHERE op1.object=op.object) op2 
           on op2.kind_property=mp.kind_property AND op2.value_property=mp.value_property
           where op2.kind_property is null
          )
16 мар 12, 08:11    [12257887]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с отбором по массиву свойств объекта  [new]

Guest
а если параметров не два?
так что
автор
либо intersect, либо group by + count
16 мар 12, 10:35    [12258406]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с отбором по массиву свойств объекта  [new]
Kateryne
Member

Откуда:
Сообщений: 351
Ну intersect - понятно как. А с group by как?
16 мар 12, 12:04    [12259136]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с отбором по массиву свойств объекта  [new]
iljy
Member

Откуда:
Сообщений: 8711
Kateryne,

select object
 from ObjectProperty o
 inner join MyProperty p
 on o.kind_property = p.kind_property
 and o.value_property = p.value_property
group by object
having count(*) = (select count(*) from MyProperty)
16 мар 12, 12:30    [12259359]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с отбором по массиву свойств объекта  [new]
Kateryne
Member

Откуда:
Сообщений: 351
iljy, точно, спасибо большое, как раз то, что нужно, а то операций типа intersect наша учетная система не позволяет.
Стыдоба - разучилась я запросы писать совсем... вот оно, зло ORM.
16 мар 12, 19:05    [12263042]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить