Соединенные таблицы
Конструкция соединенной таблицы - это альтернативный способ порождения новой таблицы на основе использования ранее определенных таблиц (базовых, представляемых или порожденных). Для этой конструкции аналоги в SQL/89 отсутствуют. Фактически соединенная таблица вносит алгебраический стиль в формулировки запросов на языке SQL. Формально соединенная таблица определяется следующими синтаксическими правилами:
<joined table> ::= <cross join> |<qualified join> |<left paren> <joined table> <right paren> <cross join> ::= <table reference> CROSS JOIN <table reference> <qualified join> ::= <table reference> [ NATURAL ] [ <join type> ] JOIN <table reference> [ <join specification> ] <join specification> ::= <join condition> |<named columns join> <join condition> ::= ON <search condition> <named columns join> ::= USING <left paren> <join column list> <right paren> <join type> ::= INNER |<outer join type> [ OUTER ] |UNION <outer join type> ::= LEFT |RIGHT |FULL <join column list> ::= <column name list>
Поскольку раньше мы не встречались с подобными конструкциями, приведем сравнительно подробные объяснения. Предположим, что соединяются таблицы T1 и T2. Пусть CP обозначает их расширенное Декартово произведения: CP = SELECT * FROMT1, T2.
- Если специфицировано квалифицированное соединение (qualifiedjoin), то
(a) если указано NATURAL (естественное соединение), то спецификация соединения (joinspecification) должна отсутствовать;
(b) если указано UNION (объединение), то должны отсутствовать и спецификация соединения, и NATURAL;
(c) в противном случае спецификация соединения должна присутствовать.
- Если специфицировано квалифицированное соединение, и не указан тип соединения (jointype), то неявно предполагается внутреннее (INNER) соединение.
- Если специфицировано квалифицированное соединение с условием соединения (joincondition), то
(a) каждая ссылка на столбец, встречающаяся в условии поиска, должна однозначно указывать на столбец таблицы T1 или T2, либо быть внешней ссылкой (ссылкой на столбец запроса более высокого уровня);
(b) если выражение со значением, непосредственно содержащееся в условии поиска, является спецификацией агрегатной функции, то соединенная таблица должна содержаться в разделе HAVING или списке выборки, и спецификация агрегатной функции должна содержать ссылку на внешний столбец. - Если не указано ни NATURAL, ни спецификация соединения, содержащая только имена столбцов соединения (namedcolumnsjoin), то описатели столбцов результата такие же, как описатели столбцов CP.
- Если указано NATURAL или если спецификация запроса содержит только имена столбцов соединения, то
(a) если указано NATURAL, то пусть именем общего столбца будет имя, являющееся именем столбца для в точности одного столбца T1 и именем столбца для в точности одного столбца T2. Столбцами соединения являются все столбцы T1 и T2 с общими именами;
(b) если указаны имена столбцов соединения, то каждое имя в этом списке имен должно быть именем столбца для в точности одного столбца T1 и именем столбца для в точности одного столбца T2. Пусть именем общего столбца является имя каждого такого столбца. Столбцами соединения являются столбцы T1 и T2, идентифицированные в списке столбцов соединения (joincolumnlist);
(c) пусть C1 и C2 пара соответствующих столбцов соединения из T1 и T2. Типы данных, на которых определены эти столбцы, должны быть совместимы;
(d) пусть SLCC - список выборки порожденных столбцов в форме COALESCE (TA.C, TB.C) ASC (см. п.3.2.4) для каждого столбца соединения в том порядке, в котором они появляются в T1;
(e) пусть SL1 - список выборки столбцов T1, не являющихся столбцами соединения, в том порядке, в котором они появляются в T1, а SL2 - аналогичный список для T2;
(f) описатели столбцов результата соединенной таблицы такие же, как описатели столбцов результата запроса SELECTSLCC, SLT1, SLT2 FROMTR1, TR2. - Каждый столбец CR результата соединенной таблицы, который не является столбцом соединения и соответствует столбцу C1 таблицы T1, потенциально может содержать неопределенные значения, если выполняется любое из следующих условий:
(a) специфицировано RIGHT, FULL или UNION;
(b) специфицировано INNER, LEFT или CROSSJOIN, и столбец С1 потенциально может содержать неопределенные значения. - Каждый столбец CR результата соединенной таблицы, который не является столбцом соединения и соответствует столбцу C2 таблицы T2, потенциально может содержать неопределенные значения, если выполняется любое из следующих условий:
(a) специфицировано LEFT, FULL или UNION;
(b) специфицировано INNER, RIGHT или CROSSJOIN, и столбец С2 потенциально может содержать неопределенные значения. - Каждый столбец CR результата соединенной таблицы, который является столбцом соединения и соответствует столбцам C1 таблицы T1 и C2 таблицы T2, потенциально может содержать неопределенные значения, если выполняется любое из следующих условий:
(a) специфицировано RIGHT, FULL или UNION и столбец C1 потенциально может содержать неопределенные значения;
(b) специфицировано LEFT, FULL или CROSSJOIN, и столбец С2 потенциально может содержать неопределенные значения. - Соединенная таблица является только читаемой.
- Определим T следующим образом:
(a) если тип соединения есть UNION, то пусть T будет пустым множеством;
(b) если специфицировано CROSSJOIN, то пусть T будет мультимножеством строк CP;
(c) если задано условие соединения, то пусть T будет мультимножеством строк CP, для которых заданное условие поиска вычисляется в true;
(d) если указаны NATURAL или имена столбцов соединения, то
(i) если имеются столбцы соединения, то пусть T будет мультимножеством строк CP, для которых соответствующие столбцы соединения имеют одинаковые значения;
(ii) в противном случае пусть T будет мультимножеством строк CP.
- Пусть P1 - мультимножество строк из T1, для которых в T существует некоторая строка, являющаяся конкатенацией некоторой строки R1 из P1 и некоторой строки R2 из T2. Пусть P2 - мультимножество строк из T2, для которых в T существует некоторая строка, являющаяся конкатенацией некоторой строки R1 из T1 и некоторой строки R2 из P2.
- Пусть мультимножество U1 составляют те строки из T1, которые не входят в P1, а U2 - строки, которые не входят в P2.
- Пусть D1 и D2 - степени T1 и T2 соответственно. Пусть X1 получается из U1 путем расширения вправо на D2 столбцов, содержащих неопределенные значения, а X2 - из U2 путем расширения влево на D1 столбцов, содержащих неопределенные значения.
- Результат соединенной таблицы S получается следующим образом:
(a) если задано INNER или CROSSJOIN, то S - мультимножество строк из T.
(b) если указано LEFT, то S - это мультимножество строк, вырабатываемое в результате следующего запроса:
SELECT * FROMT UNIONALL SELECT * FROMX1
(c) если указано RIGHT, то S - это мультимножество строк, вырабатываемое в результате следующего запроса:
SELECT * FROMT UNIONALL SELECT * FROMX2
(d) если указано FULL, то S - это мультимножество строк, вырабатываемое в результате следующего запроса:
SELECT * FROMT UNIONALL SELECT * FROMX1 UNIONALL SELECT * FROMX2
(e) если указано UNION, то S - это мультимножество строк, вырабатываемое в результате следующего запроса:
SELECT * FROMX1 UNIONALL SELECT * FROMX2