Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация выборки. Можно ли чем-то заменить подзапросы? / 8 сообщений из 8, страница 1 из 1
26.10.2019, 20:03
    #39881935
eonae
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки. Можно ли чем-то заменить подзапросы?
Уважаемые знатоки!

Помогите пожалуйста фронтендеру )

В базе данных хранится классификация продуктов. Сами признаки и возможные значения которые они могут принимать динамические, поэтому всё хранится в нескольких таблицах:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Products
   ItemID
   ....

Classifications
   ClassificationId
   Name
   ....
ClassificationOptions
   OptionId
   ClassificationId
   Name
   ....

ClassificationBindings
   ProductId
   ClassificationId
   OptionId
   ....



А теперь я хочу собрать определённые классификации, чтобы получилась таблица вида:
productName | classification1 | classification2 | ......

Умнее, чем

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select
	ItemName,
	Classification1= (select top (1) o.Name 
			from ClassificationBindings b
			left join ClassificationOptions o on b.optionId = o.optionId
			left join Classifications c on c.classificationId = b.classificationId
			where c.classificationId = 'C1' and p.ItemId = b.productId and b.Disabled is null)
        .....

from Products p 



ничего не придумал. В принципе работает с приемлемой скоростью, но не оставляет чувство, что это дикий костыль.

Подскажите пожалуйста, как сделать оптимальнее?

Если суть задачи не понятна - поясню..

Заранее спасибо!
...
Рейтинг: 0 / 0
26.10.2019, 20:06
    #39881936
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки. Можно ли чем-то заменить подзапросы?
Вот top 1 без order by это даже не костыль, а еще хуже.
А коррелированные подзапросы -- это вполне нормальное решение.
...
Рейтинг: 0 / 0
26.10.2019, 20:09
    #39881937
eonae
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки. Можно ли чем-то заменить подзапросы?
Гавриленко Сергей Алексеевич,

Оrder by есть конечно - забыл написать.

Честно говоря, меня не вполне устраивает скорость.. может быть можно как-то быстрее?
...
Рейтинг: 0 / 0
26.10.2019, 20:18
    #39881941
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки. Можно ли чем-то заменить подзапросы?
eonae,

Наверняка можно.
...
Рейтинг: 0 / 0
26.10.2019, 21:09
    #39881956
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки. Можно ли чем-то заменить подзапросы?
eonaeможет быть можно как-то быстрее?Может и можно.
Только по приведенным фрагментам кода очень трудно догадаться, что же вы хотите получить...
...
Рейтинг: 0 / 0
26.10.2019, 23:15
    #39881990
eonae
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки. Можно ли чем-то заменить подзапросы?
invm,

Постараюсь пояснить:

В таблице Classifications хранятся признаки, которые могут быть у продукта. Пример признака: "Тип" или "Горячее"

Код: sql
1.
2.
3.
INSERT INTO Classifications (id, name) VALUES
(1, 'Тип')
(2, 'Прожарка')



В таблице ClassificationOptions хранятся возможные значения, которые могут принимать признаки:

Код: sql
1.
2.
3.
4.
5.
6.
INSERT INTO ClassificationOptions (id, classification_id, name) VALUES
(1, 1, 'Еда')            -- Тип
(2, 1, 'Напиток')     -- Тип
(3, 2, 'Слабо')        -- Прожарка
(4, 2, 'Средне')      -- Прожарка
(5, 2, 'Сильно')      -- Прожарка



В таблице ClassificationBindings хранятся привязки конкретных продуктов из таблицы Products (упрощённо id и name):

Код: sql
1.
2.
3.
4.
5.
-- product_id = 5235 - Стейк

INSERT INTO ClassificationBindings (id, product_id, classification_id, option_id) VALUES
(1, 5235, 1, 1) -- Тип: Еда
(2, 5235, 2, 4) -- Прожарка: Средне



Теперь я хочу запросить к каким категориям относятся мои продукты в таблице Products.

Я могу сделать такой запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT
     p.name AS Продукт
     с.name AS Категория
     o.name AS Значение
FROM Products p
LEFT JOIN ClassificationBindings b ON p.id = b.product_id
LEFT JOIN ClassificationOptions  o ON b.option_id = o.id
LEFT JOIN Classifications c ON b.classification_id = b.classification_id



Получу в результате:

-------------------------------------------------------
Продукт | Категория | Значение
-------------------------------------------------------
Стейк | Тип | Еда
Стейк | Прожарка | Средняя
-------------------------------------------------------

Но хотел бы получить таблицу такого вида:

---------------------------------------------------
Продукт | Тип | Прожарка
---------------------------------------------------
Стейк Еда Средняя
---------------------------------------------------

Хотя в таблице категорий количество категорий может меняться динамически, в выборке мне это не требуется. Я заранее знаю какие классификации мне нужно подтянуть в качестве столбцов.

Один способ, как добиться выполнения моей задачи я уже указал выше.

Если есть более оптимальный с точки зрения производительности, буду рад, если наведётся на мысль. Писать за меня не обязательно )

С уважением.
...
Рейтинг: 0 / 0
26.10.2019, 23:23
    #39881991
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки. Можно ли чем-то заменить подзапросы?
eonae,

См. pivot
...
Рейтинг: 0 / 0
27.10.2019, 18:29
    #39882102
eonae
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация выборки. Можно ли чем-то заменить подзапросы?
Благодарю, PIVOT помог.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация выборки. Можно ли чем-то заменить подзапросы? / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]