Функция
Специфицирует мультимножество значений, полученных из результата <выражения, вырабатывающего таблицу> (<table expression>).
Формат
<subquery> ::=
(SELECT [ALL | DISTINCT] <result specification>
<table expression>)
<result specification> ::=
<value expression>
| *
Синтаксические правила
- Применимые привилегии для каждого <имени таблицы> (<table name>), содержащегося в <выражении, вырабатывающем таблицу> (<table expression>), должны включать SELECT.
Замечание: "Применимые <привилегии> (<privileges>)" для <имени таблицы> (<table name>) определяются в 6.10, "<определение привилегий> (<privileges definition>)". -
a) Если <спецификация результата> (<result specification>) "*" указана в <подзапросе> (<subquery>) какого-либо <предиката> (<predicate>), отличного от <предиката exists> (<exists predicate>), то степень <выражения, вырабатываающего таблицу> (<table expression>) должна быть равна 1 и <спецификация результата> (<result specification>) эквивалентна <выражению, вырабатывающему значение> (<value expression>), состоящему из <спецификации столбца> (<column specification>), указывающей на единственный столбец <выражения, вырабатывающего таблицу> (<table expression>).
b) Если <спецификация результата> (<result specification>) "*" указана в <подзапросе> (<subquery>) <предиката exists> (<exists predicate>), то <спецификация результата> (<result specification>) эквивалентна произвольному <выражению, вырабатывающему значение> (<value expression>), не включающему <спецификацию функции над множеством> (<table expression>) и допустимому в <подзапросе> (<subquery>). - Тип данных значений <подзапроса> (<subquery>) есть тип данных явного или неявного <выражения, вырабатывающего значение> (<value expression>).
- Пусть R обозначает результат <выражения, вырабатывающего таблицу> (<table expression>).
- Каждая <спецификация столбца> (<column specification>) в <выражении, вырабатывающем значение> (<value expression>) должна недвусмысленно ссылаться на столбец R.
- Если R - это сгруппированное представление, то <спецификация результата> (<result specification>) не должна содержать <спецификацию функции над множеством> (<set function specification>).
- Если R - это сгруппированная таблица, то каждая <спецификация столбца> (<column specification>) в <выражении, вырабатывающем значение> (<value expression>) должна указывать на столбец группирования или быть специфицированной внутри <спецификации функции над множеством> (<set function specification>). Если R это не сгруппированная таблица и <выражение, вырабатывающее значение> (<value expression>) включает <спецификацию функции над множеством> (<set function specification>), то каждая <спецификация столбца> (<column specification>) в <выражении, вырабатывающем значение> (<value expression>) должна быть указана внутри <спецификации функции над множеством> (<set function specification>).
- <Ключевое слово> (<key word>) DISTINCT не должно специфицироваться более одного раза в <подзапросе> (<subquery>), включая любой <подзапрос> (<subquery>), содержащийся в этом <подзапросе> (<subquery>).
- Если <подзапрос> (<subquery>) специфицируется в <предикате сравнения> (<comparison predicate>), то <выражение, вырабатывающее таблицу> (<table expression>) не должно содержать <раздел group by> (<group by clause>) или <раздел having> (<having clause>) и не должно идентифицировать сгруппированное представление.
Общие правила
- Если R не является сгруппированной таблицей и <выражение, вырабатывающее значение> (<value expression>) включает <спецификацию функции над множеством> (<set function specification>), то R является аргументом или источником аргумента каждой <спецификации функции над множеством> (<set function specification>) в <выражении, вырабатывающем значение> (<value expression>) и результат <подзапроса> (<subquery>) есть значение, специфицированное <выражением, вырабатывающем значение> (<value expression>).
- Если R не является сгруппированной таблицей и <выражение, вырабатывающее значение> (<value expression>) не включает <спецификацию функции над множеством> (<set function specification>), то <выражение, вырабатывающее значение> (<value expression>) применяется к каждой строке R, образуя мультимножество из n значений, где n - мощность R. Если не указано ключевое слово DISTINCT, то это мультимножество является результатом <подзапроса> (<subquery>). Если DISTINCT указано, то результатом <подзапроса> (<subquery>) является множество значений, получаемое из этого мультимножества удалением любых избыточных дублирующих значений.
- Если R - сгруппированная таблица, то <выражение, вырабатывающее значение> (<value expression>) применяется к каждой группе R, образуя мультимножество из n значений, где n - число групп в R. Когда <выражение, вырабатывающее значение> (<value expression>) применяется к данной группе R, эта группа является аргументом или источником аргумента каждой <спецификации функции над множеством> (<set function specification>) в <выражении, вырабатывающем значение> (<value expression>). Если не указано ключевое слово DISTINCT, то это мультимножество является результатом <подзапроса> (<subquery>). Если DISTINCT указано, то результатом <подзапроса> (<subquery>) является множество значений, получаемое из этого мультимножества удалением любых избыточных дублирующих значений.
5.25 <Спецификация запроса> (<query specification>)
Функция
Специфицирует таблицу, полученную из результата <выражения, вырабатывающего таблицу> (<table expression>).
Формат
<query specification> ::=
(SELECT [ALL | DISTINCT] <select list>
<table expression>)
<select list> ::=
<value expression> [{,<value expression>}]
| *
Синтаксические правила
- Применимые привилегии для каждого <имени таблицы> (<table name>), содержащегося в <выражении, вырабатывающем таблицу> (<table expression>), должны включать SELECT.
Замечание: "Применимые <привилегии> (<privileges>)" для <имени таблицы> (<table name>) определяются в 6.10, "<определение привилегий> (<privileges definition>)". - Пусть R обозначает результат <выражения, вырабатывающего таблицу> (<table specification>).
- Степень таблицы, специфицированной через <спецификацию запроса> (<query specification>) равна мощности <списка выборки> (<select list>).
- <Список выборки> (<select list>) "*" эквивалентен последовательности <выражений, вырабатывающих значение> (<value expression>), в которой каждое <выражение, вырабатывающее значение> (<value expression>) является <спецификацией столбца> (<column specification>), указывающей на столбец R, и каждый столбец R указывается ровно один раз. Столбцы указываются в порядке возрастания номеров их исходных позиций внутри R.
- Каждая <спецификация столбца> (<column specification>) в каждом <выражении, вырабатывающем значение> (<value expression>) должна однозначно указывать на столбец R. <Ключевое слово> (<key word>) DISTINCT не должно указываться более одного раза в <спецификации запроса> (<query specification>) за исключением любого <подзапроса> (<subquery>) этой <спецификации запроса> (<query specification>).
- Если R - это сгруппированное представление, то <список выборки> (<select list>) не должен содержать <спецификацию функции над множеством> (<set function specification>).
- Если R - это сгруппированная таблица, то каждая <спецификация столбца> (<column specification>) в каждом <выражении, вырабатывающем значение> (<value expression>) должна указывать на столбец группирования или быть специфицированной внутри <спецификации функции над множеством> (<set function specification>). Если R - это не сгруппированная таблица и какое-либо <выражение, вырабатывающее значение> (<value expression>) включает <спецификацию функции над множеством> (<set function specification>), то каждая <спецификация столбца> (<column specification>) в любом <выражении, вырабатывающем значение> (<value expression>) должна быть указана внутри <спецификации функции над множеством> (<set function specification>).
- Каждый столбец таблицы, являющейся результатом <спецификации запроса> (<query specification>), имеет тот же тип данных, длину, точность и масштаб, что и <выражение, вырабатывающее значение> (<value expression>), из которого он получен.
- Если i-ое <выражение, вырабатывающее значение> (<value expression>) в <списке выборки> (<select list>) состоит из единственной <спецификации столбца> (<column specification>), то i-ый столбец результата есть именованный столбец с <именем столбца> (<column name>), соответствующим <спецификации столбца> (<column specification>). В противном случае i-ый столбец является неименованным.
- На столбец таблицы, которая является результатом <спецификации столбца> (<column specification>), накладывается ограничение содержать только не неопределенные значения в том и только в том случае, когда это именованный столбец с ограничением содержать только не неопределенные значения.
- <Спецификация запроса> (<query specification>) является изменяемой (updatable) в том и только в том случае, когда выдерживаются следующие условия:
a) Ключевое слово DISTINCT не указано.
b) Каждое <выражение, вырабатывающее значение> (<value expression>) в <списке выборки> (<select list>) состоит из <спецификации столбца> (<column specification>), и ни одна <спецификация столбца> (<column specification>) не появляется более одного раза.
c) <Раздел from> (<from clause>) <выражения, выраба тывающего таблицу> (<table expression>) специфицирует в точности одну <ссылку на таблицу> (<table reference>), и эта <ссылка на таблицу> (<table reference>) указывает либо на базовую таблицу, либо на порожденную таблицу, являющуюся изменяемой (updatable).
d) <Раздел where> (<where clause>) <выражения, вырабатывающего таблицу> (<table expression>) не содержит <подзапроса> (<subquery>).
e) <Выражение, вырабатывающее таблицу> (<table expression>) не включает <раздела group by> (<group by clause>) или <раздела having> (<having clause>).
Общие правила