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

Откуда:
Сообщений: 61
Добрый день. sql server 2014, запрос формируется в самой программе на ходу в зависимости от выбранных фильтров. Суть запроса в том что нужно вывести уникальные строки из таблицы прайс листа keaz_products и только соответствующие выбранным характеристикам из другой таблицы keaz_products_spec_values, по выбранной категории продукции product_category_id, таблицы values и прайс связаны по коду продукции product_id, проверяем х-ки по значениям [keaz_products_spec_values].[spec_id] (х-ка) и ее значение [keaz_products_spec_values].[value]. Нужно проверять сразу по выбранным х-кам многочисленно. То есть чтобы было выбрано отсеивание по току и еще там типу расцепителя, сначало выбрать по одной характеристике записи, а затем по другим выбранным характеристикам отсеить из 1 набора данных записи по 2 фильтру. Теперь вопрос как по 1 набору сразу в одном запросе проверить из другой таблицы для этих данных есть записи соответствующие 2 фильтру или нет и вывести их в набор?

select distinct([keaz_products].[product_id]),[keaz_products].[title],[keaz_products].[price_with_vat] 
from [keaz_products],[keaz_products_spec_values] 
where [keaz_products].[product_category_id]='219172' and CAST([keaz_products_spec_values].[product_id] as int)=[keaz_products].[product_id]
 and (([keaz_products_spec_values].[spec_id]='35' and [keaz_products_spec_values].[value]='2000'
 or [keaz_products_spec_values].[value]='1600')
 or ([keaz_products_spec_values].[spec_id]='41' and [keaz_products_spec_values].[value]='электронный'
 or [keaz_products_spec_values].[value]='без расцепителей'))


Сообщение было отредактировано: 13 дек 16, 12:57
13 дек 16, 12:06    [19996611]     Ответить | Цитировать Сообщить модератору
 Re: Кросс динамические запросы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Moneo,

JOIN? EXISTS... подзапрос...
13 дек 16, 12:10    [19996632]     Ответить | Цитировать Сообщить модератору
 Re: Кросс динамические запросы  [new]
aleks2
Guest
Если ты отфильтруешь мутный поток свово сознания - скорее всего, сам справишься.
13 дек 16, 12:11    [19996635]     Ответить | Цитировать Сообщить модератору
 Re: Кросс динамические запросы  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
aleks2
Если ты отфильтруешь мутный поток свово сознания

Нет повода не выпить!..
13 дек 16, 12:20    [19996673]     Ответить | Цитировать Сообщить модератору
 Re: Кросс динамические запросы  [new]
Moneo
Member

Откуда:
Сообщений: 61
TaPaK
Moneo,

JOIN? EXISTS... подзапрос...


что-то у меня нет идеи как это может мне помочь.
13 дек 16, 13:34    [19997061]     Ответить | Цитировать Сообщить модератору
 Re: Кросс динамические запросы  [new]
Moneo
Member

Откуда:
Сообщений: 61
TaPaK, данный запрос выводит просто строки первого выбора, хотя совмещенный запрос включающий только те строки что есть и там и там должен содержать 4 строки.

select [keaz_products].[product_id] from [keaz_products],[keaz_products_spec_values] where 
 [keaz_products].[product_category_id]='219172' and CAST([keaz_products_spec_values].[product_id] as int)=[keaz_products].[product_id]
 and ([keaz_products_spec_values].[spec_id]='35' and [keaz_products_spec_values].[value]='2000'
 or [keaz_products_spec_values].[value]='1600')
 
and exists 

(

 select [keaz_products].[product_id] from [keaz_products],[keaz_products_spec_values] where [keaz_products].[product_category_id]='219172' and CAST([keaz_products_spec_values].[product_id] as int)=[keaz_products].[product_id]
 and ([keaz_products_spec_values].[spec_id]='41' and [keaz_products_spec_values].[value]='без расцепителей')
)
13 дек 16, 14:38    [19997656]     Ответить | Цитировать Сообщить модератору
 Re: Кросс динамические запросы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Moneo,

ну так теперь изучите JOIN
13 дек 16, 14:39    [19997665]     Ответить | Цитировать Сообщить модератору
 Re: Кросс динамические запросы  [new]
Jaffar
Member

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

Это что-то вроде интернет-магазина
select p.*
from keaz_products_spec_values sv1 with(nolock)
------------------------------------------------
join keaz_products_spec_values sv2 with(nolock) on sv2.Product_id = sv1.Product_id and sv2.spec_id = @Spec_ID2 and sv2.Values = @Va2 -- второе условие
join keaz_products_spec_values sv3 with(nolock) on sv3.Product_id = sv1.Product_id and sv3.spec_id = @Spec_ID3 and sv3.Values = @Va3 -- третье условие
-- join ... и т.д. сколько еще нужно условий 
---------------------------------------------
join keaz_products p with(nolock) on p.Product_id = sv1.Product_id
where
		sv1.spec_id = @Spec_ID1 -- первое условие
and		sv1.Values  = @Val1


Суть в следующем: сначала ты с 1 условием,
потом когда выбрано второе условие - добавляешь второе условие (join) - потом третье и т.д.

Я бы вообще порекомендовал бы тебе сделать процедуру
где входной параметр будет строка в которой будут перечислены сочетания параметров выбора
'[spec_id = 2, Value = 4];[spec_id = 7, Value = 5][spec_id = 13, Value = FFF]'

потом эту строчку, внутри процедуры, можно развернуть в табличную переменную где для каждой пары тип-значение будет своя строчка.
а дальше динамически собрать запрос и exec`ать его в процедуре, она вернет набор данных который ты покажешь.

вот как-то так.
13 дек 16, 14:52    [19997770]     Ответить | Цитировать Сообщить модератору
 Re: Кросс динамические запросы  [new]
aleks2
Guest
TaPaK
Moneo,

ну так теперь изучите JOIN


Ты заныкал intersect!
13 дек 16, 14:55    [19997781]     Ответить | Цитировать Сообщить модератору
 Re: Кросс динамические запросы  [new]
Moneo
Member

Откуда:
Сообщений: 61
aleks2, ты мой спаситель и не потребовалось никаких нагромождений. Сообщение предыдущее от Jaffar до конца не понял, хотелось бы разобраться конечно на будущее. Что такое with(nolock), что такое sv1 итд это замена имен таблиц или это счетчик join, где объявляются переменные. В случае процедуры она тоже должна быть динамической и брать входные данные прямо из программы. Это я делаю так фильтрацию продукции, опыта сложных запросов у меня не было и с написанием процедур знаком лишь по наслышке, поэтому буду благодарен если кто пояснит сообщение выше, а также поможет накидать процедуру или даст правильный пинок под зад в качестве хороших ссылок.
13 дек 16, 15:55    [19998210]     Ответить | Цитировать Сообщить модератору
 Re: Кросс динамические запросы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
автор
Jaffar,

Суть в следующем: сначала ты с 1 условием,
потом когда выбрано второе условие - добавляешь второе условие (join) - потом третье и т.д.
...
потом эту строчку, внутри процедуры, можно развернуть в табличную переменную где для каждой пары тип-значение будет своя строчка.
а дальше динамически собрать запрос и exec`ать его в процедуре, она вернет набор данных который ты покажешь.

священника вызовите кто нибудь
13 дек 16, 16:05    [19998268]     Ответить | Цитировать Сообщить модератору
 Re: Кросс динамические запросы  [new]
Jaffar
Member

Откуда:
Сообщений: 633
TaPaK
священника вызовите кто нибудь


Заболел - полечись, пока б/пл.
14 дек 16, 05:57    [20000308]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить