FROM-спецификация

Функция

Определение таблицы, получаемой из объединения одной или нескольких таблиц (представлений).

Спецификация

           
< FROM-спецификация >::=
< порожденная таблица >::=
< курсорная процедура >::=
< метод выборки >::=
BERNOULLI | SYSTEM
< процент выборки >::=
неотрицательное целочисленное значение
< номер выборки >::=
положительное целочисленное значение

Синтаксические правила

  1. < Имя таблицы > можно использовать в запросе только тогда, когда < табличная ссылка > не задает < псевдоним таблицы >.

  2. Максимальное количество < табличных ссылок > равно 32.

  3. < Имя таблицы >, указанное во < 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;
  4. < Псевдоним таблицы > не должен совпадать с другим псевдонимом в той же < FROM-спецификации > и не должен совпадать с < именем таблицы >, заданном в той же < FROM-спецификации >.

  5. Областью видимости псевдонимов и имен таблиц во < FROM-спецификации > является вложенный < подзапрос >, содержащий < табличное выражение > с этой < FROM-спецификацией >. Область видимости псевдонима не включает саму < FROM-спецификацию >.

  6. Список < псевдонимов столбцов > по количеству должен совпадать с количеством столбцов в < первичной таблице > или < порожденной таблице >.

    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);
  7. Варианты:

    • если во < FROM-спецификации > одна < табличная ссылка >, то описание результата < FROM-спецификации > то же, что и описание таблицы из этой < табличной ссылки >;

    • если во < FROM-спецификации > содержится более одной < табличной ссылки >, то описание результата < FROM-спецификации > представляет собой конкатенацию описаний таблиц, идентифицированных этими < табличными ссылками >, в порядке следования во < FROM-спецификации >;

    • спецификация псевдонима (открытого < имени таблицы >) устанавливает, что этот псевдоним (< имя таблицы >) используется как ее обозначение, определенное таблицей, которая, в свою очередь, определена < именем таблицы > или < порожденной таблицей >.

      select * from (select (select  count(*) from auto
       where person.personid=auto.personid and make='FORD') n from person);
  8. Конструкция TABLESAMPLE предназначена для выборки из большой (по числу записей) таблицы заданного количества случайных записей.

  9. Конструкция TABLESAMPLE не применима к представлениям.

  10. < Процент выборки > задаёт число (процент) от всех записей в таблице, которые будут включены в выборку. Допустимое значение – в диапазоне от 0 до 100 включительно. Реально будет возвращено не строго заданное количество процентов записей, а приблизительное.

    SELECT make, model FROM auto TABLESAMPLE (5);
  11. Опция < метод выборки > задаёт метод вычисления номера записи таблицы для включения её в случайную выборку. В данной версии СУБД методы BERNOULLI и SYSTEM можно использовать только в качестве допустимых элементов синтаксической конструкции, но реальной нагрузки они пока не несут (игнорируются): номер записи для выборки формируется на основе генератора псевдослучайных чисел, встроенного в СУБД.

  12. Опция 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|
  13. Конструкция TABLESAMPLE может применяться ко всем или нескольким таблицам во < FROM-спецификации >, при этом значения < процента выборки > и < номера выборки > берутся из первой конструкции TABLESAMPLE, значения из остальных конструкций TABLESAMPLE игнорируются.

    select * from auto T1 TABLESAMPLE (10) REPEATABLE (1), person T2 TABLESAMPLE (20) REPEATABLE (1) where T1.personid=T2.personid;
  14. < Курсорная процедура > – хранимая процедура, возвращающая курсор. При использовании < курсорной процедуры > обращение к полям курсора недопустимо.

    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);
  15. В качестве входных параметров < курсорной процедуры > допускается использовать SELECT-запросы, возвращающие единственное значение требуемого типа.

  16. При выполнении 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;