Подзапросы
В стандарте SQL/92 специфицированы три вида подзапросов: скалярный, строчный и табличный. Скалярный подзапрос выдает одно значение некоторого типа; строчный подзапрос выдает одну строку; табличный подзапрос выдает таблицу. В основе каждого вида подзапроса лежит табличное выражение. Синтаксически соответствующие конструкции определяются следующими правилами:
<scalar subquery> ::= <subquery> <row subquery> ::= <subquery> <table subquery> ::= <subquery> <subquery> ::= <left paren> <query expression> <right paren>
Пояснения:
Степень скалярного подзапроса должна быть равна 1. Степень строчного подзапроса должна быть больше 1. Тип данных скалярного подзапроса совпадает с типом данных соответствующего столбца выражения запросов. Типы данных столбцов строчного или табличного подзапроса совпадают с типами данных соответствующих столбцов выражения запросов. Если мощность скалярного или строчного подзапроса больше 1, то возбуждается исключительное условие.
Теперь мы в состоянии привести синтаксические определения и соответствующие пояснения по поводу выражения запросов:
<query expression> ::= <non-join query expression> |<joined table> <non-join query expression> ::= <non-join query term> |<query expression> UNION [ ALL ] [ <corresponding spec> ] |<query term> <query expression> EXCEPT [ ALL ] [ <corresponding spec> ] <query term> <query term> ::= <non-join query term> |<joined table> <non-join query term> ::= <non-join query primary> |<query term> INTERSECT [ ALL ] [ <corresponding spec> ] <query primary> <query primary> ::= <non-join query primary> |<joined table> <non-join query primary> ::= <simple table> |<left paren> <non-join query expression> <right paren> <simple table> ::= <query specification> |<table value constructor> |<explicit table> <explicit table> ::= TABLE <table name> <corresponding spec> ::= CORRESPONDING [ BY <left paren> <corresponding column list> <right paren> ] <corresponding column list> ::= <column name list>
Пояснения:
Если в терме или выражении запросов без соединения присутствует теоретико-множественный оператор, то пусть T1, T2 и TR обозначают соответственно первый операнд, второй операнд и результат терма или выражения, а OP - используемую теоретико-множественную операцию. Если специфицировано CORRESPONDING, то
(a) одно имя столбца не должно быть специфицировано более одного раза для столбцов T1 и T2;
(b) по крайней мере один столбец T1 должен иметь имя, являющееся именем некоторого столбца T2;
(c) если список соответствия столбцов не задан, пусть SL обозначает список выборки с указанием имен столбцов, являющихся именами столбцов и в T1, и в T2, в том порядке, в котором эти имена фигурируют в T1;
(d) если список соответствия столбцов задан, то пусть SL обозначает список выборки с указанием тех имен столбцов, явно входящих в список соответствия, в том порядке, в котором эти имена фигурируют в списке соответствия; каждое имя столбца в списке соответствия должно быть именем столбца и T1, и T2;
(e) терм или выражение запросов без соединения эквивалентны следующему:
(SELECTSLFROMTN1) OP (SELECTSLFROMTN2).
Если CORRESPONDING не указано, то T1 и T2 должны быть одинаковой степени. Если не задан теоретико-множественный оператор, то результатом вычисления выражения запросов является результат вычисления простой или соединенной таблицы. Если теоретико-множественный оператор задан, то результатом его применения является таблица, содержащая следующие строки:
(a) пусть R - строка, являющаяся дубликатом некоторой строки T1 или некоторой строки T2 или обоих; пусть m - число дубликатов R в T1, а n - число дубликатов R в T2;
(b) если специфицировано ALL, то
(i) если указана операция UNION, то число дубликатов R в T равно m + n;
(ii) если указана операция EXCEPT, то число дубликатов R в T равно max ((m-n),0);
(iii) если указана операция INTERSECT, то число дубликатов R в T равно min (m,n).
Все публикации раздела