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;