Wednesday, April 17, 2013

Алгоритм для использования подзапросов SUBQUERRY

Чтобы решить ту или иную задачу c использованием подзапросов SUBQUERY,  необходимо подумать, отталкиваясь от меньшего к большему, задавая себе вопросы и отвечая на них.

Последовательность вопросов и действий:

Вопрос 1:
Что я должен получить по условию задачи? В какой таблице мы можем это видеть?

Полезно построить диаграмму БД, прежде, чем присутпить к построению запросов.

В зависимости от ответа, сразу пишем запрос к той таблице, из которой можно получить результат. Например, если то, что нам нужно находится в TABLE1 и это NAME1, то пишем

SELECT NAME1
FROM TABLE1

Вопрос 2:
Из какой таблицы я могу получить недостающие данные?
Поняв ее имя, сразу открываем скобки в основном запросе и помещаем в них подзапрос к недостающим данным. Если эти данные LACK_DATA в таблице TABLE2, то внутренний подзапрос будет выглядеть так (синим):

SELECT NAME1,
               (
               SELECT LACK_DATA 
               FROM  TABLE2
               )
FROM TABLE1

Вопрос 3:
Как недостающие данные и данные из основого запроса связаны между собой? Пусть они связаны по столбцу ORDER_ID. Тогда добавляем условие WHERE во внутренний запрос (синим):
SELECT NAME1,
               (
               SELECT LACK_DATA
               FROM  TABLE2
               WHERE TABLE2.ORDER_ID=TABLE1.ORDER_ID
               )
FROM TABLE1


Рассмотрим пример: Сколько штук каждого товара мы продали по БД на диаграмме ниже?





Вопрос 1: Что ищем и где это есть? Ищем имена товаров ProductName и они есть в таблице Products. Пишем:

SELECT ProductName
FROM Products

Вопрос 2: Что нам не хватает и в какой таблице мы можем найти эти недостающие данные?
Нам нужно кол-во QUANTITY каждого продукта. И это есть в таблице [Order Details]
Открываем скобки и пишем подзапрос (синим)
SELECT ProductName,
            (SELECT COUNT(Quantity)
             FROM [Order Details]
             ) 

FROM Products

Вопрос 3: Каким образом связаны таблицы Products и [Order Details]? Ответ: По полю ProductID. Добавляем во внутренний запрос условие (синим)

SELECT ProductName,
            (SELECT COUNT(Quantity)
             FROM [Order Details]
             WHERE [Order Details].ProductID=Products.ProductID 
              )
FROM Products

Готово! На выходе мы имеем список и кол-во проданных товаров. 

Далее можно отсортировать по кол-ву. Удобнее внутреннему запросу дать имя, для его использования в ORDER BY

SELECT ProductName,
            (SELECT COUNT(Quantity)
             FROM [Order Details]
             WHERE [Order Details].ProductID=Products.ProductID
            ) AS QTY
FROM Products
ORDER BY QTY DESC

Если нужно вывести только имя самого продаваемого товара, то в SELECT можно добавить TOP и подзапрос переместить в Order BY.
Т.о. запрос будет выглядить следующим образом:


SELECT TOP 1 ProductName
FROM
Products
ORDER BY
            (SELECT
COUNT(Quantity)
             FROM
[Order Details]
            WHERE
[Order Details].ProductID=Products.ProductID 
           
)       
DESC






No comments: