Вложенный запрос |
Вложенный запрос используется в конструкции 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 тип результирующего поля определяется типом агрегируемого выражения по следующим правилам:
Для целочисленных типов агрегируемого выражения результат имеет тип longInt;
Для выражений типа comp - результат имеет тип comp;
Для выражений типа date, time или _DateTime - результат имеет тип _DateTime;
Для агрегируемых выражений вещественных типов - результат double;
Для string, char, boolean результат не определен, компилироваться не будет.
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.