powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Оптимизация выборки. Можно ли чем-то заменить подзапросы?
8 сообщений из 8, страница 1 из 1
Оптимизация выборки. Можно ли чем-то заменить подзапросы?
    #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
Оптимизация выборки. Можно ли чем-то заменить подзапросы?
    #39881936
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот top 1 без order by это даже не костыль, а еще хуже.
А коррелированные подзапросы -- это вполне нормальное решение.
...
Рейтинг: 0 / 0
Оптимизация выборки. Можно ли чем-то заменить подзапросы?
    #39881937
eonae
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,

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

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

Наверняка можно.
...
Рейтинг: 0 / 0
Оптимизация выборки. Можно ли чем-то заменить подзапросы?
    #39881956
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eonaeможет быть можно как-то быстрее?Может и можно.
Только по приведенным фрагментам кода очень трудно догадаться, что же вы хотите получить...
...
Рейтинг: 0 / 0
Оптимизация выборки. Можно ли чем-то заменить подзапросы?
    #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
Оптимизация выборки. Можно ли чем-то заменить подзапросы?
    #39881991
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eonae,

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


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