Далее для демонстрации CROSS JOIN рассмотрим задачи на основе базы Northwind, загрузить ее образец можно с http://msdn.microsoft.com/ru-ru/library/ms143221(v=sql.105).aspx
Диаграмма БД:
Задача 1.
Сколько городов обслужил каждый продавец?
1) Осмыслить структуры базы и объединить все таблицы, упомянутые в задаче
SELECT *
FROM Employees E CROSS JOIN Orders O
Получим малополезный массив кол-во строк первой таблицы * кол-во строк второй таблицы
2) Профильтровать так, чтобы остались только осмысленные записи, т.е. те, которые имеют смысл в реальности.
SELECT *
FROM Employees E CROSS JOIN Orders O
WHERE E.EmployeeID=O.EmployeeID
3) Спрашиваем себя, что мы получили в результате. В данном примере это список всех заказов ORDERS.
Это нам нужно для того, чтобы позже
4) Всегда GROUP BY
А чего я хочу получить по задаче? Я хочу список продавцов, значит в GROUP BY пишем продавцов
SELECT E.FirstName+' '+E.LastName, count(DISTINCT ShipCity)
FROM Employees E CROSS JOIN Orders O
WHERE E.EmployeeID=O.EmployeeID
GROUP BY E.FirstName+' '+E.LastName
ORDER BY count(DISTINCT ShipCity) DESC
Задача 2.
Как зовут покуптелей, делавших в 1996-м заказы у нескольких продавцов?
SELECT C.ContactName, COUNT (DISTINCT EMPLOYEEID)
FROM CUSTOMERS C CROSS JOIN Orders O
WHERE C.CustomerID=O.CustomerID
AND YEAR (ORDERDATE)=1996
GROUP BY C.ContactName
HAVING COUNT (DISTINCT EMPLOYEEID) > 1
COUNT (DISTINCT EMPLOYEEID) из SELECT можно убрать
Задачи с тремя и более таблицами и JOIN-ами можно решать по такому же алгоритму:
Диаграмма БД:
Задача 1.
Сколько городов обслужил каждый продавец?
1) Осмыслить структуры базы и объединить все таблицы, упомянутые в задаче
SELECT *
FROM Employees E CROSS JOIN Orders O
Получим малополезный массив кол-во строк первой таблицы * кол-во строк второй таблицы
2) Профильтровать так, чтобы остались только осмысленные записи, т.е. те, которые имеют смысл в реальности.
SELECT *
FROM Employees E CROSS JOIN Orders O
WHERE E.EmployeeID=O.EmployeeID
3) Спрашиваем себя, что мы получили в результате. В данном примере это список всех заказов ORDERS.
Это нам нужно для того, чтобы позже
4) Всегда GROUP BY
А чего я хочу получить по задаче? Я хочу список продавцов, значит в GROUP BY пишем продавцов
SELECT E.FirstName+' '+E.LastName, count(DISTINCT ShipCity)
FROM Employees E CROSS JOIN Orders O
WHERE E.EmployeeID=O.EmployeeID
GROUP BY E.FirstName+' '+E.LastName
ORDER BY count(DISTINCT ShipCity) DESC
Задача 2.
Как зовут покуптелей, делавших в 1996-м заказы у нескольких продавцов?
SELECT C.ContactName, COUNT (DISTINCT EMPLOYEEID)
FROM CUSTOMERS C CROSS JOIN Orders O
WHERE C.CustomerID=O.CustomerID
AND YEAR (ORDERDATE)=1996
GROUP BY C.ContactName
HAVING COUNT (DISTINCT EMPLOYEEID) > 1
COUNT (DISTINCT EMPLOYEEID) из SELECT можно убрать
Задачи с тремя и более таблицами и JOIN-ами можно решать по такому же алгоритму:
No comments:
Post a Comment