Wednesday, April 17, 2013

Алгоритм для использования объединения таблиц CROSS JOIN

Далее для демонстрации 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-ами можно решать по такому же алгоритму:









No comments: