Фиктивные таблицы
Иногда нужное значение еще не существует на момент отправки запроса, так как оно возвращается функцией или вычисляется по ходу, и его нужно откуда-то взять. Это место может быть любой таблицей базы данных, к которой существуют привилегии отбора данных (см. главу 12). Однако поддержка дополнительных таблиц иногда неудобна, поскольку конечный пользователь должен знать, какие таблицы содержит база данных, и изменять запросы каждый раз, когда они переименовываются или удаляются. Кроме того, когда литерал или выражение отбирается из реальной таблицы, в результирующем наборе данных будет столько же строк, сколько и в указанной таблице. Это привело к появлению концепции фиктивных таблиц, которая по — своему реализована в каждой СУБД.
SQL:2003 Фиктивные таблицы, равно как и сама возможность отбора “из ничего”, не определены в стандарте SQL. Они стали ответом производителей СУБД на потребности пользователей. Oracle предлагает специальную таблицу с названием DUAL для случаев, когда физического объекта (таблицы или представления) для отбора данных не существует. Предположим, что нужно узнать системное время в базе данных Oracle. Для этого существует системная функция с названием SYSDATE. Эта функция отсутствует в стандарте SQL:2003 — она является расширением языка PL/SQL. Так как все запросы должны начинаться с ключевого слова SELECT, мы его укажем, однако в базе данных не хранится запрашиваемая информация — она генерируется динамически по требованию. В подобных ситуациях пригодится таблица DUAL; из нее можно “извлечь” практически все, что угодно. В СУБД DB2 реализована аналогичная концепция — фиктивная таблица SYSDUMMY1, расположенная в системной схеме SYSIBM. Эта таблица имеет один столбец с названием IBMREQD, в единственной строке которого содержится значение Y. В следующем примере продемонстрировано использование этой таблицы для вычисления суммы двух чисел. Сумма этих чисел нигде не хранится, однако, согласно стандарту SQL:2003, она должна быть извлечена. Данная концепция становится особенно важной при использовании функций SQL в процедурных языках (таких как Oracle PL/SQL, IBM SQL PL и Microsoft Transact-SQL).