loading..
Русский    English
09:10
листать

Эти «хитрые» внешние соединения стр. 2

Как правило, в приводимых примерах используются эквисоединения, т.е. соединения по равенству значений (=). Это обусловлено тем, что на практике зачастую используется соединение по внешнему ключу. Подобные примеры можно увидеть на предыдущей странице.  Однако предикатом соединения может быть любое логическое выражение.  Для иллюстрации рассмотрим следующую задачу.

Найти такие поступления в таблице Income_o, каждое из которых превосходит любой из расходов в таблице Outcome_o.

Решение.

Консоль
Выполнить
  1. SELECT Income_o.* FROM Outcome_o RIGHT JOIN Income_o ON Outcome_o.out >= Income_o.inc
  2. WHERE Outcome_o.out IS NULL;

В вышеприведенном решении внешнее соединение выполняется по неравенству  Outcome_o.out >= Income_o.inc, которому отвечают строки из таблицы Income_o, для которых приход не превышает расхода для каких-либо строк в таблице Outcome_o. Кроме того, во внешнем соединении (в данном случае в правом) будут присутствовать и строки из таблицы Income_o, для которых не нашлось ни одной строки в таблице Outcome_o, делающей истинным значение предиката.

Это и есть строки, являющиеся решением нашей задачи. Чтобы их выбрать, используем тот факт, что отсутствующие значения столбцов из соединяемой таблицы (у нас левой) заполняются NULL-значениями. Соответствующий критерий помещаем в предложение WHERE.

Разумеется, эту задачу можно решить и другими способами, например:

max + подзапрос

Консоль
Выполнить
  1. SELECT Income_o.* FROM Income_o
  2. WHERE Income_o.inc > (SELECT MAX(Outcome_o.out) FROM Outcome_o);

all + подзапрос

Консоль
Выполнить
  1. SELECT Income_o.* FROM Income_o
  2. WHERE Income_o.inc > ALL(SELECT Outcome_o.out FROM Outcome_o);

Bookmark and Share
Страницы: 1 2
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX Больше тэгов
Учебник обновлялся
месяц назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100