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;