FROM-спецификация
Функция
Определение таблицы, получаемой из объединения одной или нескольких таблиц (представлений).
Спецификация
::=
::=
::=
[[AS] псевдоним таблицы [( псевдоним столбца [, ...])]
[TABLESAMPLE [ метод выборки ]( процент выборки)]
[REPEATABLE номер выборки]
::=
::=
::=
::=
::=
Синтаксические правила
-
< Имя таблицы >
можно использовать в запросе только тогда, когда< табличная ссылка >
не задает< псевдоним таблицы >
. -
Максимальное количество < табличных ссылок > равно 32.
-
< Имя таблицы >
, указанное во< FROM-спецификации >
, не должно совпадать с другим< именем таблицы >
, задаваемым в этой же< FROM-спецификации >
.SELECT count(*) FROM auto a, auto b WHERE a.PersonID=b.PersonID; SELECT * FROM (SELECT * FROM Person P, Auto A WHERE P.PersonID=A.PersonID) AS Pa, SELECT * FROM PERSON P, Finance F WHERE P.PersonID=F.PersonID) AS Pf limit 5;
-
< Псевдоним таблицы >
не должен совпадать с другим псевдонимом в той же< FROM-спецификации >
и не должен совпадать с< именем таблицы >
, заданном в той же< FROM-спецификации >
. -
Областью видимости псевдонимов и имен таблиц во
< FROM-спецификации >
является вложенный< подзапрос >
, содержащий< табличное выражение >
с этой< FROM-спецификацией >
. Область видимости псевдонима не включает саму< FROM-спецификацию >
. -
Список
< псевдонимов столбцов >
по количеству должен совпадать с количеством столбцов в< первичной таблице >
или< порожденной таблице >
.create or replace table tst(i int, c char(5)); insert into tst(i,c) values(200, '1111'); select col1 from tst as a (col1,col2); select sysdate, user, col2 from tst b (col1,col2); select col2, field1 from tst a (col1,col2), (select sysdate, user) as b (field1, field2);
-
Варианты:
-
если во
< FROM-спецификации >
одна< табличная ссылка >
, то описание результата< FROM-спецификации >
то же, что и описание таблицы из этой< табличной ссылки >
; -
если во
< FROM-спецификации >
содержится более одной< табличной ссылки >
, то описание результата< FROM-спецификации >
представляет собой конкатенацию описаний таблиц, идентифицированных этими< табличными ссылками >
, в порядке следования во< FROM-спецификации >
; -
спецификация псевдонима (открытого
< имени таблицы >
) устанавливает, что этот псевдоним (< имя таблицы >
) используется как ее обозначение, определенное таблицей, которая, в свою очередь, определена< именем таблицы >
или< порожденной таблицей >
.select * from (select (select count(*) from auto where person.personid=auto.personid and make='FORD') n from person);
-
-
Конструкция
TABLESAMPLE
предназначена для выборки из большой (по числу записей) таблицы заданного количества случайных записей. -
Конструкция
TABLESAMPLE
не применима к представлениям. -
< Процент выборки >
задаёт число (процент) от всех записей в таблице, которые будут включены в выборку. Допустимое значение – в диапазоне от 0 до 100 включительно. Реально будет возвращено не строго заданное количество процентов записей, а приблизительное.SELECT make, model FROM auto TABLESAMPLE (5);
-
Опция
< метод выборки >
задаёт метод вычисления номера записи таблицы для включения её в случайную выборку. В данной версии СУБД методыBERNOULLI
иSYSTEM
можно использовать только в качестве допустимых элементов синтаксической конструкции, но реальной нагрузки они пока не несут (игнорируются): номер записи для выборки формируется на основе генератора псевдослучайных чисел, встроенного в СУБД. -
Опция
REPEATABLE
задает номер повторяемой выборки (число от 1 до 65535). Одинаковые значения< номера выборки >
и< процента выборки >
приводят к повторному возвращению заданной выборки (если только в таблице не произошли изменения). Если опцияREPEATABLE
указывается с другим значением< номера выборки >
(или< процента выборки >
), то будет сформирован иной набор строк таблицы. Изменениями считаются следующие действия над таблицей: вставка, обновление, удаление, перестройка индекса.select count(make) from auto tablesample (5) repeatable (1); | 60|
select count(make) from auto tablesample (5) repeatable (2); | 54|
select count(make) from auto tablesample (5) repeatable (7); | 48|
select count(make) from auto tablesample (5) repeatable (1); | 60|
-
Конструкция
TABLESAMPLE
может применяться ко всем или нескольким таблицам во< FROM-спецификации >
, при этом значения< процента выборки >
и< номера выборки >
берутся из первой конструкцииTABLESAMPLE
, значения из остальных конструкцийTABLESAMPLE
игнорируются.select * from auto T1 TABLESAMPLE (10) REPEATABLE (1), person T2 TABLESAMPLE (20) REPEATABLE (1) where T1.personid=T2.personid;
-
< Курсорная процедура > – хранимая процедура, возвращающая курсор. При использовании < курсорной процедуры > обращение к полям курсора недопустимо.
create or replace procedure proc_test (in i int) result cursor( MAKE char(20), MODEL char(20), BODYTYPE char(15), CYLNDERS integer, HORSEPWR integer, DSPLCMNT integer, WEIGHT integer, COLOR char(10), YEAR integer, SERIALNO char(16), CHKDATE integer, CHKMILE integer, PERSONID integer) declare var d typeof(result);// code open d for direct "select * from auto where personid = " + itoa(i) + ";";// return d;// end; select * from proc_test (5);
-
В качестве входных параметров < курсорной процедуры > допускается использовать SELECT-запросы, возвращающие единственное значение требуемого типа.
-
При выполнении SELECT-запроса с < курсорной процедурой > во FROM в случае возврата неоткрытого курсора ошибка будет игнорироваться, и запрос будет работать так, как если бы процедура вернула пустой курсор.
Примеры
select * from a TABLESAMPLE(10) REPEATABLE(2) order by aj, ai; select * from a TABLESAMPLE(10) REPEATABLE(2),b where ai=bi; select * from a TABLESAMPLE(10) REPEATABLE(2),b where ai >=bi; select * from a TABLESAMPLE(10) REPEATABLE(2), b where aj=bj and ai=bi;