Здавалка
Главная | Обратная связь

Табличное выражение, спецификация запроса и выражение запросов



Табличным выражением (table_expression) называется конструкция

table_expression ::= FROM table_reference_commalist [ WHERE conditional_expression ] [ GROUP BY column_name_commalist ] [ HAVING conditional_expression ]

Спецификацией запроса (query_specification) называется конструкция

query_specification SELECT [ ALL | DISTINCT ] select_item_commalist table_expression

Наконец, выражением запросов (query_expression) называется конструкция

query_expression ::= [ with_clause ] query_expression_bodyquery_expression_body ::= { non_join_query_expression | joined_table }non_join_query_expression ::= non_join_query_term | query_expression_body { UNION | EXCEPT }[ ALL | DISTINCT ] [ corresponding_spec ] query_term query_term ::= non_join_query_term | joined_tablenon_join_query_term ::= non_join_query_primary | query_term INTERSECT [ ALL | DISTINCT ] [ corresponding_spec ] query_primaryquery_primary ::= non_join_query_primary | joined_tablenon_join_query_primary ::= simple_table | (non_join_query_expression)simple_table ::= query_specification | table_value_constructor | TABLE table_namecorresponding_spec ::= CORRESPONDING [ BY column_name_comma_list ]

Если не обращать внимания на не обсуждавшиеся пока конструкции joined_table и table_value_constructor, синтаксические правила показывают, что выражение запросов строится из выражений, значениями которых являются таблицы, с использованием «теоретико-множественных»129) операций UNION (объединение), EXCEPT (вычитание) и INTERSECT (пересечение). Операция пересечения является «мультипликативной» и обладает более высоким приоритетом, чем «аддитивные» операции объединения и вычитания. Вычисление выражения производится слева направо с учетом приоритетов операций и круглых скобок. При этом действуют следующие правила.

  • Если выражение запросов не включает ни одной теоретико-множественной операции, то результатом вычисления выражения запросов является результат вычисления простой или соединенной таблицы.
  • Если в терме (non_join_query_term) или выражении запросов (non_join_query_expression) без соединения присутствует теоретико-множественная операция, то пусть T1, T2 и TR обозначают соответственно первый операнд, второй операнд и результат терма или выражения соответственно, а OP – используемую теоретико-множественную операцию.
  • Если в операции присутствует спецификация CORRESPONDING, то:
    1. если присутствует конструкция BY column_name_comma_list, то все имена в этом списке должны быть различны, и каждое имя должно являться одновременно именем некоторого столбца таблицы T1 и именем некоторого столбца таблицы T2, причем типы этих столбцов должны быть совместимыми; обозначим данный список имен через SL;
    2. если список соответствия столбцов не задан, пусть SL обозначает список имен столбцов, являющихся именами столбцов и в T1, и в T2, в том порядке, в котором эти имена фигурируют в T1;
    3. вычисляемые терм или выражение запросов без соединения эквивалентны выражению (SELECT SL FROM T1) OP (SELECT SL FROM T2), не включающему спецификацию CORRESPONDING.
  • При отсутствии в операции спецификации CORRESPONDING операция выполняется таким образом, как если бы эта спецификация присутствовала и включала конструкцию BY column_name_comma_list, в которой были бы перечислены все столбцы таблицы T1.130)
  • При выполнении операции OP две строки s1 с именами столбцов c1, c2, …, cn и s2 с именами столбцов d1, d2, …, dn считаются строками-дубликатами, если для каждого i (i = 1, 2, …, n) либо ci и di не содержат NULL, и (ci = di) = true131), либо и ci, и di содержат NULL.
  • Если в операции OP не задана спецификация ALL, то в TR строки-дубликаты удаляются.

129 Мы использовали кавычки, поскольку таблицы, к которым применяются операции, в общем случае могут содержать строки-дубликаты, т.е. являться мультимножествами.

130 Другими словами, при отсутствии спецификации CORRESPONDING требуется, чтобы заголовки таблиц-операндов совпадали за исключением, возможно, порядка следования столбцов.

131 С учетом возможности неявного приведения типов.

  • Если спецификация ALL задана, то пусть s – строка, являющаяся дубликатом некоторой строки T1, или некоторой строки T2, или обеих; пусть m – число дубликатов s в T1, а n – число дубликатов s в T2. Тогда:
    • если указана операция UNION, то число дубликатов s в TR равно m + n;
    • если указана операция EXCEPT, то число дубликатов s в TR равно max ((m-n),0);
    • если указана операция INTERSECT, то число дубликатов s в TR равно min (m,n).






©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.