Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SQL.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
327.17 Кб
Скачать

Операции 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.';

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]