- •Выборка данных
- •Оператор select
- •Выражения sql
- •Выражение from
- •Операции left join, right join
- •Операция inner join
- •Выражение in
- •Предикаты all, distinct, distinctrow, top
- •Объявление with owneraccess option
- •Выражение where
- •Операция Like
- •Операция In
- •Операция Between...And
- •Подзапрос
- •Выражение order by
- •Выражение group by
- •Выражение having
- •Оператор union
- •Оператор transform
- •Выражение procedure
- •Объявление parameters
- •Изменение данных
- •Оператор update
- •Оператор insert into
- •Оператор delete
- •Изменение структуры
- •Оператор select...Into
- •Оператор create table3
- •Выражение constraint4
- •Оператор alter table5
- •Оператор create index6
- •Оператор drop7
- •Агрегатные функции
- •Функция Count
- •Функция Avg
- •Функция Sum
- •Функции Var и VarP
- •Функции StDev и StDevP
- •Функции Min, Max
- •Функции First, Last
Операции left join, right join
Комбинируют записи из таблиц-источников в выражении FROM. В результате создаются записи с большим количеством полей (таблица «расширяется»). Формат
FROM table1 [ LEFT | RIGHT ] JOIN table2 ON table1.field1 compopr table2.field2
Операции LEFT JOIN и RIGHT JOIN имеют следующие части:
Часть |
Описание |
table2, table2 |
Названия комбинируемых таблиц |
field1, field2 |
Имена полей, по которым производится объединение. Поля должны содержать данные одного и того же типа, но могут называться по-разному. |
compopr |
Операция сравнения: "=", "<", ">", "<=", ">=" или "<>". |
Операция LEFT JOIN объединяет каждую запись из первой (левой) таблицы с теми записями из второй (правой), которые удовлетворяют критерию compopr. При этом из первой таблицы в набор включаются все записи – левое внешнее объединение.
Операция RIGHT JOIN объединяет каждую запись из второй (правой) таблицы с теми записями из первой (левой), которые удовлетворяют критерию compopr. При этом из второй таблицы в набор включаются все записи – правое внешнее объединение.
Например при объединении таблиц Departments (левой) и Employees (правой) с помощью LEFT JOIN будут выведены все отделы, включая те, где нет сотрудников. При объединении с помощью RIGHT JOIN будут выведены все сотрудники, включая тех, кто не приписан ни к какому отделу.
Следующий запрос объединяет таблицы Categories и Products по полю CategoryID, выводя все категории, включая те, которые не содержат продуктов:
SELECT CategoryName, ProductName FROM Categories LEFT JOIN Products ON Categories.CategoryID = Products.CategoryID;
При этом значения CategoryID не выводятся, т.к. их нет в списке SELECT.
Для запросов, где значения полей связи одинаковы предпочтительнее операция INNER JOIN. Операции LEFT JOIN и RIGHT JOIN могут входить в INNER JOIN, но INNER JOIN не может входить в LEFT JOIN или RIGHT JOIN. Связь может устанавливаться несколькими выражениями ON. При попытке связать по Memo или OLE полям происходит ошибка.
Таблицу можно объединять саму с собой, но при этом нужно использовать псевдоним. Например, имеется таблица tbl с полями idx (повторяется) и val. Следующий запрос пронумерует val «внутри» каждого idx:
SELECT Count(t2.val)+1 AS N, t1.idx AS Code, t1.val AS Val FROM tbl AS t1 LEFT JOIN tbl AS t2 ON (t1.val>t2.val) AND (t1.idx=t2.idx) GROUP BY t1.idx, t1.val ORDER BY t1.idx, t1.val;
t1 и t2 используются как псевдонимы для таблицы tbl.
В следующем примере предполагается наличие полей Department Name и Department ID в таблице Employees (их нет в таблице базы Northwind). Выводятся все отделы, включая тех, где нет сотрудников (вызывается процедура EnumFields из примера к FROM):
Sub LeftRightJoinX()
Dim dbs As Database, rst As Recordset
' Modify this line to include the path to Northwind on your computer.
Set dbs = OpenDatabase("Northwind.mdb")
' Select all departments, including those without employees.
Set rst = dbs.OpenRecordset("SELECT [Department Name], " _ & "FirstName & Chr(32) & LastName AS Name " _ & "FROM Departments LEFT JOIN Employees " _ & "ON Departments.[Department ID] = Employees.[Department ID] " _ & "ORDER BY [Department Name];")
rst.MoveLast ' Populate the Recordset
' Call EnumFields to print the contents of the Recordset.
' Pass the Recordset object and desired field width.
EnumFields rst, 20
dbs.Close
End Sub
Для следующиго примера нужно создать новый запрос в базе Northwind и в окне конструктора ввести:
SELECT Customers.CustomerID, CompanyName, OrderID FROM Customers LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID ORDER BY OrderID;
– все заказчики, включая тех, у кого нет заказов.
SELECT Suppliers.SupplierID, Suppliers.CompanyName, Products.ProductID, Products.ProductName FROM Products RIGHT JOIN Suppliers ON Products.SupplierID = Suppliers.SupplierID ORDER BY Products.SupplierID;
– все поставщики, включая тех, у кого нет продукции. Перед выполнением запроса нужно ввести данные в таблицу Suppliers:
INSERT INTO Suppliers (CompanyName, ContactName, ContactTitle) VALUES ('Acme Supply Co.', 'That Coyote', 'Sales Manager');
Чтобы удалить введенные записи, нужно выполнить запрос
DELETE * FROM Suppliers WHERE CompanyName = 'Acme Supply Co.';
