Эти «хитрые» внешние соединения стр. 2 |
|||||
Как правило, в приводимых примерах используются эквисоединения, т.е. соединения по равенству значений (=). Это обусловлено тем, что на практике зачастую используется соединение по внешнему ключу. Подобные примеры можно увидеть на предыдущей странице. Однако предикатом соединения может быть любое логическое выражение. Для иллюстрации рассмотрим следующую задачу. Найти такие поступления в таблице Income_o, каждое из которых превосходит любой из расходов в таблице Outcome_o. Решение.
В вышеприведенном решении внешнее соединение выполняется по неравенству Outcome_o.out >= Income_o.inc, которому отвечают строки из таблицы Income_o, для которых приход не превышает расхода для каких-либо строк в таблице Outcome_o. Кроме того, во внешнем соединении (в данном случае в правом) будут присутствовать и строки из таблицы Income_o, для которых не нашлось ни одной строки в таблице Outcome_o, делающей истинным значение предиката. Это и есть строки, являющиеся решением нашей задачи. Чтобы их выбрать, используем тот факт, что отсутствующие значения столбцов из соединяемой таблицы (у нас левой) заполняются NULL-значениями. Соответствующий критерий помещаем в предложение WHERE. Разумеется, эту задачу можно решить и другими способами, например: max + подзапрос
all + подзапрос
|