Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [MSSQL'05]Оптимизация запроса с временной таблицей 
V
    Опции темы
Dogo
Дата 12.8.2008, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 20.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 9



ЗАДАЧА: 
Получить список заказчиков, которые сделали < 3х заказов.

ДИАГРАММА БД:
user posted image

МОЕ РЕШЕНИЕ:
Код

SELECT DISTINCT c.FirstName, c.LastName, o.OrderID 
INTO #Tmp
FROM Customers c
JOIN Orders o
    ON o.CustomerID = c.CustomerID
GROUP BY  c.FirstName, c.LastName, o.OrderID
ORDER BY c.LastName

SELECT FirstName + ' ' + LastName AS CustomerName, COUNT(OrderID) AS OdersNumber
FROM #Tmp
GROUP BY FirstName, LastName
HAVING COUNT(OrderID) < 3

DROP TABLE #Tmp


Подскажите, есть ли возможность оптимизировать запрос? Переписать его с использованием связанного подзапроса? 


PM MAIL ICQ   Вверх
Akina
Дата 12.8.2008, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



А что,
Код

SELECT FirstName + ' ' + LastName AS CustomerName, COUNT(OrderID) AS OrdersNumber
FROM Customers c
JOIN Orders o
  ON o.CustomerID = c.CustomerID
GROUP BY CustomerName
HAVING OrdersNumber < 3

не работает, что ли?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Dogo
Дата 12.8.2008, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 20.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 9



Нет, так работать не будет.
Один заказ может включать несколько типов Product => будет занимать несколько строк.
В следствии чего агрегирующая функция COUNT вернет не то что от нее требуется.
Ниже привел возможный вариант таблицы Orders

Код

OrderID     CustomerID  ProductID   Quantity    OrderDate
----------- ----------- ----------- ----------- -----------------------
1           1           1           1           1999-01-01 00:00:00
1           1           9           1           1999-01-01 00:00:00
2           2           3           1           1999-02-02 00:00:00
2           2           6           1           1999-02-02 00:00:00
2           2           8           3           1999-02-02 00:00:00
2           2           9           1           1999-02-02 00:00:00
3           1           4           1           2003-05-02 00:00:00
4           5           1           1           2001-01-01 00:00:00
4           5           2           1           2003-02-01 00:00:00
5           4           3           3           2008-05-02 00:00:00

--------------------
 
PM MAIL ICQ   Вверх
skyboy
Дата 12.8.2008, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 15
Всего: 260



Цитата(Dogo @  12.8.2008,  18:34 Найти цитируемый пост)
Один заказ может включать несколько типов Product => будет занимать несколько строк.

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

PM MAIL   Вверх
Dogo
Дата 12.8.2008, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 20.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 9



Я создал эту тему не для того чтобы оптимизировать структуру БД(в данном случае это сделать нельзя). 
А для того чтобы оптимизировать запрос, то есть я хочу узнать можно ли его переписать с использованием связанного подзапроса.
На мой взгляд, сделать это нельзя, но т.к. опыт работы с БД у меня небольшой, я решил задать вопрос опытным людям.

PM MAIL ICQ   Вверх
Akina
Дата 12.8.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Dogo @  12.8.2008,  20:34 Найти цитируемый пост)
Один заказ может включать несколько типов Product => будет занимать несколько строк.

В таблице Orders??? афигеть... ну ладно...
Код

SELECT FirstName + ' ' + LastName AS CustomerName, COUNT(OrderID) AS OrdersNumber
FROM Customers c
JOIN 
( SELECT DISTINCT OrderID, CustomerID
  FROM Orders
) o
  ON o.CustomerID = c.CustomerID
GROUP BY CustomerName
HAVING OrdersNumber < 3



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Dogo
Дата 12.8.2008, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 147
Регистрация: 20.2.2007
Где: Санкт-Петербург

Репутация: нет
Всего: 9



Akina, Спасибо! smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0688 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.