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;