Сравнение эквисоединений с неэквисоединениями Все запросы к нескольким таблицам, показанные до сих пор, исполь
зовали
эквисоединения (
equijoins ). Это означает, что для обеспечения
успешности соединения значения двух таблиц должны совпадать. Эк
висоединение всегда использует знак равенства, например:
ON e.assigned_branch_id = b.branch_id
Подавляющее большинство запросов использует эквисоединения, но
можно также соединять таблицы посредством диапазонов значений,
называемых
неэквисоединениями (
nonequijoins ). Вот пример запроса,
осуществляющего соединение по диапазону значений:
SELECT e.emp_id, e.fname, e.lname, e.start_date
FROM employee e INNER JOIN product p
ON e.start_date >= p.date_offered AND e.start_date <= p.date_retired WHERE p.name = 'nofee checking';
Этот запрос соединяет две таблицы, между которыми нет взаимосвя
зей по внешним ключам. Задача – найти всех сотрудников, принятых
в банк в то время, когда предлагалась услуга беспроцентного текущего
вклада. Таким образом, дата начала работы сотрудника должна нахо
диться между датами начала и конца этой акции.
Также может понадобиться
рекурсивное неэквисоединение (
selfnon equijoin ), которое означает, что таблица соединяется сама с собой с ис
пользованием неэквисоединения. Например, управляющий операция
ми решил провести шахматный турнир между всеми операциониста
ми банка. Требуется создать список всех пар игроков. Можно попробо
вать получить список всех операционистов (
title
=
'Teller'
), соединив
таблицу
employee
с самой собой, и выбрать из него все строки с разными
значениями
emp_id
(поскольку игрок не может составить пару с самим
собой):
mysql>