Вложенный запрос Назад В начало Вперед

Вложенный запрос используется в конструкции from (см. "Список таблиц для выборки. ").

В Атлантис имеется возможность использования в запросах агрегированных значений. Агрегация производится по вложенному запросу основного запроса (по внешней логической таблице - ЛТ). Вложенный запрос - специальная форма ЛТ, описываемая внутри описания внешней ЛТ.

Для каждой записи внешней ЛТ вложенный запрос формирует одну и только одну запись, являющуюся результатом агрегирования множества записей вложенного запроса, определяемых его условиями where. Полями этой записи являются результаты агрегатных функций, таких как sum, count и т.п.

В качестве ограничителей множества агрегирования в условии where вложенного запроса возможно использование полей внешней ЛТ и других доступных величин. Результирующие поля вложенного запроса помещаются во внешнюю ЛТ, т.е. доступ к ним можно осуществлять как к обычным полям ЛТ. Также такие поля можно использовать в качестве видимых полей интерфейса.

Вложенные запросы могут, в свою очередь, содержать другие вложенные запросы. Однако, следует избегать глубокой вложенности - вычисление агрегированных значений является ресурсоёмкой операцией.

Синтаксис является расширением стандарта SQL-92 в части использования вложенных запросов в конструкции from. В конструкцию from внешней ЛТ добавляется возможность описать выбираемое выражение в качестве таблицы, поля которой затем можно использовать по всей внешней ЛТ.

Синтаксис вложенного запроса в основном повторяет синтаксис оператора выборки select, отличие же заключается в том, что в качестве элементов выборки допускается использовать только агрегатные выражения:

<вложенный-запрос> = ( select
  <агрегатное-выражение> [(<атрибут> {, <атрибут>})  ]
  {, <агрегатное-выражение> [ (<атрибут> {, <атрибут>}) ] }
  [ <список-таблиц-для-выборки> ]
  [ <конструкция-where> ])

<агрегатное-выражение> - формирует одну и только одну запись из множества записей вложенного запроса.

<агрегатное-выражение> =
  Count(*) | First(<выражение>) | Last(<выражение>)
  | Min(<выражение>) | Max(<выражение>)
  | Sum(<выражение>) | Avg(<выражение>)

Count(*) - количество записей

Тип результирующего выражения агрегатной функции Count - longInt.

Если Вы хотите получить количество записей в таблице, удовлетворяющих некоторому условию, в конструкции where следует использовать жесткую подцепку. Если в таблице нет записей, удовлетворяющих заданному условию, жесткая подцепка вернет пустую выборку, для которой Count(*) примет значение 0.

Мягкая подцепка в той же ситуации вернет запись, заполненную значениями по умолчанию. Соответственно, Count(*) для полученной выборки будет равно 1.

Подробнее о жесткой и мягкой подцепке см. "Конструкция where. ". Также см. пример 5 в конце раздела.

First(<выражение>) - значение первой записи

Агрегатная функция First может быть применена для агрегации выражений любого типа. Тип результирующего поля в случае применения этой функции соответствует типу агрегируемого выражения.

Last(<выражение>) - значение последней записи

Агрегатная функция Last может быть применена для агрегации выражений любого типа. Тип результирующего поля в случае применения этой функции соответствует типу агрегируемого выражения.

Min(<выражение>) - минимальное значение

Типы результирующих полей для функции Min соответствуют типу агрегируемого выражения. Для агрегируемых полей типа string, char или boolean результат не определен, компилироваться такое выражение не будет.

Max(<выражение>) - максимальное значение

Типы результирующих полей для функции Max соответствуют типу агрегируемого выражения. Для агрегируемых полей типа string, char или boolean результат не определен, компилироваться такое выражение не будет.

Sum(<выражение>) - сумма значений всех записей

Для агрегатной функции Sum тип результирующего поля определяется типом агрегируемого выражения по следующим правилам:

Avg(<выражение>) - среднее значение

Типы результирующих полей для функции Avg соответствуют типу агрегируемого выражения. Для агрегируемых полей типа string, char или boolean результат не определен, компилироваться такое выражение не будет.

<выражение> - вычисляемое выражение в текущем контексте.

Данные типа LVar использовать в качестве агрегируемого выражения нельзя.

<атрибут> - элемент выборки может иметь атрибуты, которые заключаются в круглые скобки и располагаются вслед за выражением:

<атрибут> =
  fieldName [ = ] <имя-поля-ЛТ>
  | fieldTitle [ = ] <заголовок-поля-ЛТ>
  | fieldLenght [ = ] <длина-поля-ЛТ>

<имя-поля-ЛТ> - идентификатор.

<заголовок-поля-ЛТ> - строка.

<длина-поля-ЛТ> - целое число.

<список-таблиц-для-выборки> - см. раздел "Список таблиц для выборки. ".

<конструкция-where> - см. раздел "Конструкция where. ".

Примеры

Пример 1. Вложенный запрос включается в список таблиц для выборки.

select * from
  SomeTable1,
  (select Sum(someField) from SomeTable2)
;

Пример 2. Результирующему полю назначается имя. Теперь к нему можно обращаться из внешней ЛТ или использовать в качестве видимого поля интерфейса.

select someFieldName from
  SomeTable1,
  (select Sum(someField) (fieldName "someFieldName") from SomeTable2)
;

Пример 3. Вложенному запросу назначается имя.

select SomeSynonym.* from
  SomeTable1,
  (select Sum(someField) from SomeTable2) SomeSynonym
;

Пример 4. В условии where вложенного запроса используются поля внешней ЛТ. Также возможно использование других доступных величин.

select * from
  SomeTable1,
  (select Sum(someField) from SomeTable2 where ((SomeTable1.id1 == SomeTable2.id2)))
;

Пример 5. Полученная выборка кроме полей таблицы SomeTable1 содержит количество записей в таблице SomeTable2 имеющих тот же код, что и текущая запись SomeTable1.

select * from
  SomeTable1,
  (select Coun(*) from SomeTable2 where ((SomeTable1.code /== SomeTable2.code)))
;

Версия

Атлантис 5.1.20.