Чтобы решить ту или иную задачу 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
Последовательность вопросов и действий:
Вопрос 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:
Post a Comment