Внешние соединения

 

Но имеются два важных частных случая соединений, которые выражаются с помощью традиционных средств SQL излишне громоздко: естественные и внешние соединения. При наличии возможности определения внешних ключей таблицы кажется достаточно странной потребность всякий раз явно указывать в запросах условие естественного соединения. Например, во многих примерах запросов в Лекции 14 присутствует условие соединения EMP.DEPT_NO = DEPT.DEPT_NO в тех случаях, когда в действительности нам требовался результат операции EMP NATURAL JOIN DEPT.

 

Внешние соединения были введены еще Эдгаром Коддом в 1979 г. Говоря очень нестрого, основная идея этой разновидности операции соединения состояла в том, что, с одной стороны, результат операции обычного соединения двух отношений повышает информационный уровень данных, поскольку в результате операции мы имеем информационно связанные данные. Но, с другой стороны, в результирующем отношении мы теряем информацию об исходных объектах, которые оказались несвязанными и не вошли в результат соединения. Кодд придумал, как, используя неопределенные значения, можно определить обобщенную операцию, которая будет обладать достоинствами обычной операции соединения, не приводя к потере исходной информации. Вернее, он предложил три операции: левое внешнее соединение, правое внешнее соединение и полное (симметричное) внешнее соединение. Приведем их определения (в реляционных терминах данного курса).

 

Пусть имеются отношения r1 и r2, совместимые относительно операции взятия расширенного декартова произведения. Пусть s является результатом операции r1 LEFT OUTER JOUN r2 WHERE comp (левое внешнее соединение r1 и r2 по условию comp). Тогда Hs = Hr1 union Hr2. Пусть tr1 Î Br1 и tr2 Î Br2. Тогда tr1 union tr2 Î Bs в том и только в том случае, когда comp (tr1 union tr2) = true. Если имеется кортеж tr1 Î Br1, для которого нет ни одного кортежа tr2 Î Br2 такого, что comp (tr1 union tr2) = true, то tr1 union tr2null Î Bs, где tr2null – кортеж, соответствующий Hr2, все значения которого являются неопределенными*.

 

Пусть s является результатом операции r1 RIGHT OUTER JOUN r2 WHERE comp (правое внешнее соединение r1 и r2 по условию comp). Тогда Hs = Hr1 union Hr2. Пусть tr1 Î Br1 и tr2 Î Br2. Тогда tr1 union tr2 Î Bs в том и только в том случае, когда comp (tr1 union tr2) = true. Если имеется кортеж tr2 Î Br2, для которого нет ни одного кортежа tr1 Î Br1 такого, что comp (tr1 union tr2) = true, то tr1null union tr2 Î Bs, где tr1null – кортеж, соответствующий Hr1, все значения которого являются неопределенными.

 

Наконец, пусть s является результатом операции r1 FULL OUTER JOUN r2 WHERE comp (полное внешнее соединение r1 и r2 по условию comp). Тогда Hs = Hr1 union Hr2. Пусть tr1 Î Br1 и tr2 Î Br2. Тогда tr1 union tr2 Î Bs в том и только в том случае, когда comp (tr1 union tr2) = true. Если имеется кортеж tr1 Î Br1, для которого нет ни одного кортежа tr2 Î Br2 такого, что comp (tr1 union tr2) = true, то tr1 union tr2null Î Bs, где tr2null – кортеж, соответствующий Hr2, все значения которого являются неопределенными. Если имеется кортеж tr2 Î Br2, для которого нет ни одного кортежа tr1 Î Br1 такого, что comp (tr1 union tr2) = true, то tr1null union tr2 Î Bs, где tr1null – кортеж, соответствующий Hr1, все значения которого являются неопределенными.

 

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

 

В стандарте языка SQL специфицирован отдельный специализированный подъязык для формирования выражений соединения таблиц. Такие выражения называются соединенными таблицами, и их можно использовать в качестве ссылок на таблицы в списке раздела FROM. Разработчики стандарта SQL не любят мельчить; в языке допускается 14 видов соединений:

§ прямое соединение;

§ внутреннее соединение по условию;

§ внутреннее соединение по совпадению значений указанных одноименных столбцов;

§ естественное внутреннее соединение;

§ левое внешнее соединение по условию;

§ правое внешнее соединение по условию;

§ полное внешнее соединение по условию;

§ левое внешнее соединение по совпадению значений указанных одноименных столбцов;

§ правое внешнее соединение по совпадению значений указанных одноименных столбцов;

§ полное внешнее соединение по совпадению значений указанных одноименных столбцов;

§ естественное левое внешнее соединение;

§ естественное правое внешнее соединение;

§ естественное полное внешнее соединение;

§ соединение объединением.

 

Во всех этих операциях нет ничего сложного, но их неформальное описание исключительно громоздко. Поэтому в разд 15.4 мы определяем операции на формальном уровне, а потом иллюстрируем их на примерах.

 

Наконец, последняя тема этой лекции относится к еще одному типу ссылок на таблицу, допускаемых в разделе FROM: порождаемым таблицам с горизонтальной связью. Фактически, порождаемая таблица с горизонтальной связью представляет собой выражение запросов, в котором может присутствовать корреляция со строками таблиц, специфицированных в списке раздела FROM слева от данной порождаемой таблицы с горизонтальной связью. Наличие порождаемых таблиц с горизонтальной связью требует некоторого уточнения семантики выполнения раздела FROM оператора SELECT. По нашему мнению, это средство является полностью избыточным, хотя и не вредным, поскольку его реализация не должна вызывать затруднений и/или ухудшать эффективность системы.