Введение в стандарты языка баз данных SQL

Соединенные таблицы


Конструкция соединенной таблицы - это альтернативный способ порождения новой таблицы на основе использования ранее определенных таблиц (базовых, представляемых или порожденных). Для этой конструкции аналоги в 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.

  1. Если специфицировано квалифицированное соединение (qualifiedjoin), то

      (a) если указано NATURAL (естественное соединение), то спецификация соединения (joinspecification) должна отсутствовать;

      (b) если указано UNION (объединение), то должны отсутствовать и спецификация соединения, и NATURAL;

      (c) в противном случае спецификация соединения должна присутствовать.

  2. Если специфицировано квалифицированное соединение, и не указан тип соединения (jointype), то неявно предполагается внутреннее (INNER) соединение.
  3. Если специфицировано квалифицированное соединение с условием соединения (joincondition), то


      (a) каждая ссылка на столбец, встречающаяся в условии поиска, должна однозначно указывать на столбец таблицы T1 или T2, либо быть внешней ссылкой (ссылкой на столбец запроса более высокого уровня);

      (b) если выражение со значением, непосредственно содержащееся в условии поиска, является спецификацией агрегатной функции, то соединенная таблица должна содержаться в разделе HAVING или списке выборки, и спецификация агрегатной функции должна содержать ссылку на внешний столбец.


  4. Если не указано ни NATURAL, ни спецификация соединения, содержащая только имена столбцов соединения (namedcolumnsjoin), то описатели столбцов результата такие же, как описатели столбцов CP.
  5. Если указано 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.




  6. Каждый столбец CR результата соединенной таблицы, который не является столбцом соединения и соответствует столбцу C1 таблицы T1, потенциально может содержать неопределенные значения, если выполняется любое из следующих условий:


      (a) специфицировано RIGHT, FULL или UNION;

      (b) специфицировано INNER, LEFT или CROSSJOIN, и столбец С1 потенциально может содержать неопределенные значения.


  7. Каждый столбец CR результата соединенной таблицы, который не является столбцом соединения и соответствует столбцу C2 таблицы T2, потенциально может содержать неопределенные значения, если выполняется любое из следующих условий:


      (a) специфицировано LEFT, FULL или UNION;

      (b) специфицировано INNER, RIGHT или CROSSJOIN, и столбец С2 потенциально может содержать неопределенные значения.


  8. Каждый столбец CR результата соединенной таблицы, который является столбцом соединения и соответствует столбцам C1 таблицы T1 и C2 таблицы T2, потенциально может содержать неопределенные значения, если выполняется любое из следующих условий:


      (a) специфицировано RIGHT, FULL или UNION и столбец C1 потенциально может содержать неопределенные значения;

      (b) специфицировано LEFT, FULL или CROSSJOIN, и столбец С2 потенциально может содержать неопределенные значения.


  9. Соединенная таблица является только читаемой.
  10. Определим T следующим образом:


      (a) если тип соединения есть UNION, то пусть T будет пустым множеством;

      (b) если специфицировано CROSSJOIN, то пусть T будет мультимножеством строк CP;

      (c) если задано условие соединения, то пусть T будет мультимножеством строк CP, для которых заданное условие поиска вычисляется в true;

      (d) если указаны NATURAL или имена столбцов соединения, то

      (i) если имеются столбцы соединения, то пусть T будет мультимножеством строк CP, для которых соответствующие столбцы соединения имеют одинаковые значения;

      (ii) в противном случае пусть T будет мультимножеством строк CP.



  11. Пусть P1 - мультимножество строк из T1, для которых в T существует некоторая строка, являющаяся конкатенацией некоторой строки R1 из P1 и некоторой строки R2 из T2. Пусть P2 - мультимножество строк из T2, для которых в T существует некоторая строка, являющаяся конкатенацией некоторой строки R1 из T1 и некоторой строки R2 из P2.
  12. Пусть мультимножество U1 составляют те строки из T1, которые не входят в P1, а U2 - строки, которые не входят в P2.
  13. Пусть D1 и D2 - степени T1 и T2 соответственно. Пусть X1 получается из U1 путем расширения вправо на D2 столбцов, содержащих неопределенные значения, а X2 - из U2 путем расширения влево на D1 столбцов, содержащих неопределенные значения.
  14. Результат соединенной таблицы 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

  • Если указаны NATURAL или список имен столбцов соединения, то окончательный результат соединенной таблицы - это мультимножество строк из S, получаемое в результате выполнения следующего запроса: SELECTSLCC, SL1, SL2 FROMS. В противном случае окончательным результатом является S.



  • Содержание раздела