ДВОЙНАЯ таблица — DUAL table
Таблица DUAL — это специальная таблица с одной строкой и одним столбцом таблица, присутствующая по умолчанию в Oracle и других установках базы данных.. В Oracle таблица имеет единственный столбец VARCHAR2 (1) с именем DUMMY, имеющий значение «X». Он подходит для использования при выборе псевдостолбца, такого как SYSDATE или USER.
- 1 Пример использования
- 2 История
- 3 Оптимизация
- 4 В других системах баз данных
- 5 Примечания
Пример использования
Oracle SQL требует наличия предложения FROM, но для некоторых запросов не требуются таблицы — в этих случаях можно использовать DUAL.
ВЫБРАТЬ 1 + 1 ИЗ двойного; ВЫБЕРИТЕ 1 ИЗ двойного; ВЫБРАТЬ ПОЛЬЗОВАТЕЛЯ ИЗ двойного; ВЫБРАТЬ SYSDATE ИЗ двойного; ВЫБРАТЬ * ИЗ двойного;
История
Чарльз Вайс объясняет, почему он создал DUAL:
Я создал таблицу DUAL как базовый объект в словаре данных Oracle. Он никогда не предназначался для того, чтобы его видели, а вместо этого использовался внутри представления, которое, как ожидалось, должно было быть запрошено. Идея заключалась в том, что вы можете выполнить JOIN с таблицей DUAL и создать две строки в результате для каждой строки в вашей таблице. Затем, используя GROUP BY, результирующее соединение можно суммировать, чтобы показать объем памяти для экстента DATA и экстента (ов) INDEX. Имя DUAL казалось подходящим для процесса создания пары строк из одной.
Оптимизация
Начиная с версии 1 10g, Oracle больше не выполняет физический или логический ввод-вывод в таблице DUAL., хотя таблица все еще существует.
DUAL легко доступен для всех пользователей в базе данных.
В других системах баз данных
Некоторые другие базы данных (включая Microsoft SQL Server, MySQL, PostgreSQL, SQLite и Teradata) позволяют полностью опустить предложение FROM, если таблица не требуется. Это избавляет от необходимости использовать какой-либо фиктивный стол.
- Firebird имеет однострочную системную таблицу RDB $ DATABASE, которая используется так же, как Oracle DUAL, хотя и имеет собственное значение.
- IBM DB2 имеет представление, что разрешает DUAL при использовании совместимости с Oracle. В нем также есть таблица с именем sysibm.sysdummy1, которая имеет свойства, аналогичные свойствам таблицы Oracle DUAL.
- Informix : Informix версии 11.50 и более поздних версий содержит таблицу с именем sysmaster: «informix».sysdual с та же функциональность, но с более подробным названием. Вы можете использовать CREATE PUBLIC SYNONYM dual FOR sysmaster: «informix».sysdual , чтобы создать имя dual в текущей базе данных с той же функциональностью.
- Microsoft Access : Таблица с именем DUAL может быть создана, и ограничение одной строки может быть применено через ADO (запрос UNION без таблицы в MS Access )
- Microsoft SQL Server : SQL Server не требует фиктивной таблицы. Запросы типа ‘ select 1 + 1 ‘может быть запущен без предложения / имени таблицы «from».
- MySQL позволяет указывать DUAL в виде таблицы в запросах, которым не нужны данные из каких-либо таблиц. Он подходит для использования в выбор функции результата, такой как SYSDATE () или USER (), хотя это и не обязательно.
- PostgreSQL : для упрощения портирования можно добавить DUAL-view от Oracle.
- Snowflake : DUAL поддерживается, но явно не задокументирован. Он появляется в примере SQL для других операций в документации.
- SQLite : VIEW с именем » dual «, который работает так же, как таблица Oracle» dual «, может быть создан как fo llows: CREATE VIEW dual AS SELECT ‘x’ AS dummy;
- SAP HANA имеет таблицу с именем DUMMY, которая работает так же, как «двойная» таблица Oracle.
- База данных Teradata делает не требуется фиктивный стол. Такие запросы, как ‘select 1 + 1’, можно запускать без предложения «from» / имени таблицы.
таблица dual
Таблица dual очень проста. Она состоит из одного поля и содержит одно значение.
SQL> desc dual Name Null? Type ----------------------------------------- -------- ---------------------------- DUMMY VARCHAR2(1) SQL> select * from dual; D - X
Однако это значение никого не интересует. Таблица используется для получения данных, не имеющих отношения к dual. Например:
SQL> select user from dual; USER ------------------------------ SCOTT
Чтобы получить значение user, мы с таким же успехом могли бы выполнить запрос
select user from emp where rownumDual используется для таких выборок просто потому, что она всегда существует. Это объект под пользователем sys и он появляется при создании базы. И никто (за исключением любопытных DBA) не может его изменить. Однако, если задаться целью поиграться с dual (исключительно на тестовой базе), то можно обнаружить интересные вещи:
SQL> connect / as sysdba; Connected. SQL> insert into dual values('X'); 1 row created. SQL> insert into dual values('X'); 1 row created. SQL> select count(*) from dual; COUNT(*) ---------- 3 SQL> select * from dual; D - XНесмотря на то, что dual теперь содержит 3 строки, select выбирает только одну. Что это -- у базы "поехала крыша" от того, что мы внесли изменения в словарь (ведь формально dual -- часть словаря)?
Строго говоря, нет.SQL> delete from dual; 1 row deleted. SQL> select * from dual; D - X SQL> select count(*) from dual; COUNT(*) ---------- 2Мы хотели удалить все строки из dual, но удалилась только одна.
Объяснение этому следующее: оптимизатор подразумевает, что таблица dual в любых условиях будет содержать только одну строку.
Впрочем, в каком-то смысле, dual не совсем обычная таблица. Вот пример:
SQL> select * from dual; D - X 1 row selected. SQL> . ; Statement processed. SQL> select * from dual; ADDR INDX INST_ID D -------- ---------- ---------- - 26683298 0 1 X 1 row selected.Что за магическая команда была выполнена, которая привела к таким изменениям в таблице dual?
Ответ: alter database close.
Дело здесь вот в чём: RMAN'у нужен доступ к dual даже когда база закрыта, поэтому при закрытии базы dual остаётся доступна, но с изменённой структурой и содержимым.
В конце нашей коротенькой заметки хочется повторить следующее: помните, что таблица dual -- часть системного словаря и Вы ни в коем случае не должны её каким-либо образом изменять на базе, где работают пользователи.
Оракл для начинающих | Oracle for beginners (18+)
Оракл для начинающих. Советы программистам, администраторам, IT-специалистам, только начинающим изучать СУБД Oracle. Оракл для чайников.
Таблица DUAL и для чего она нужна
В Oracle, в отличие от того же MS SQL Server, нельзя сделать запрос "из ниоткуда".
SELECT 1
*
ERROR at line 1:
ORA-00923: FROM keyword not found where expectedПоэтому в большинстве запросов должна быть ссылка на таблицу или представление. Как правило, для таких запросов используется таблица DUAL. Таблица DUAL - это реальная таблица в схеме SYS, содержащая только одну запись.
SELECT * FROM DUAL;
1 rows selected
Как можно использовать таблицу DUAL в запросах? К примеру мы хотим получить системное время. Тогда, раз что-то во FROM указывать надо - укажем таблицу DUAL:
SELECT SYSDATE FROM DUAL;
В каких случаях применяется DUAL и какой смысл этом?
Вопрос теоретический. Изучаю Oracle и встречаю такую конструкцию как DUAL. Понимаю, что это некоторая виртуальная таблица, но мне бы хотелось понять сам смысл этой штуки, зачем и когда применяется.
Отслеживать
задан 17 сен 2019 в 3:41
Vladimr Vladimirovoch Vladimr Vladimirovoch
1,603 1 1 золотой знак 13 13 серебряных знаков 30 30 бронзовых знаков1 ответ 1
Сортировка: Сброс на вариант по умолчанию
В синтаксически корректном запросе ОБЯЗАНА быть секция FROM.
Иногда требуется запрос/подзапрос, выполняющий формирование литералов (либо выполняющий константные вычисления), т.е. не основывающийся на какой-либо таблице. Например, CTE, генерирующая набор чисел или список дат. Однако секция FROM в запросе быть обязана - именно в этом случае и используется FROM DUAL . Т.е. и синтаксис соблюдён, и явно сказано, что таблицы для выполнения запроса не нужны. Подробности см. ниже.
Например, в запросе требуется набор чисел от 1 до 9. Задача решается простейшим CTE.
WITH cte AS ( SELECT 1 num FROM DUAL UNION ALL SELECT num+1 FROM cte WHERE num < 9 )Базовая часть UNION-запроса возвращает литерал - единицу, от которой потом и пляшет рекурсивная часть. Источника данных (таблицы) в этой части UNION-запроса никакой нет и в помине. Однако FROM обязан быть. И на помощь приходит FROM DUAL .
Аналогично будет, если в запросе нужен список кастомных литеральных значений. Например
SELECT . FROM . JOIN ( SELECT 2000 "year" FROM DUAL UNION ALL SELECT 2005 FROM DUAL UNION ALL SELECT 2008 FROM DUAL UNION ALL SELECT 2013 FROM DUAL UNION ALL SELECT 2014 FROM DUAL ) "years" .Или если нужно выполнить какие-то вычисления с константами
SELECT . FROM . JOIN ( SELECT 1024 bytes_to_kbytes, 1024*1024 bytes_to_Mbytes 1024*1024*1024 bytes_to_Gbytes FROM DUAL ) koefficients .SELECT . FROM . JOIN ( SELECT ADD_MONTHS(SYSDATE, -@delta1-@delta2) period_start, ADD_MONTHS(SYSDATE, -@delta2) period_end FROM DUAL ) periods .Если обратиться к документации (Selecting from the DUAL Table), то:
DUAL is a table automatically created by Oracle Database along with the data dictionary. DUAL is in the schema of the user SYS but is accessible by the name DUAL to all users. It has one column, DUMMY, defined to be VARCHAR2(1), and contains one row with a value X. Selecting from the DUAL table is useful for computing a constant expression with the SELECT statement. Because DUAL has only one row, the constant is returned only once. Alternatively, you can select a constant, pseudocolumn, or expression from any table, but the value will be returned as many times as there are rows in the table. Refer to "About SQL Functions" for many examples of selecting a constant value from DUAL.
Если коротко, то DUAL - это физически реальная таблица, которая находится в схеме пользователя sys , но доступна на чтение любому пользователю. Она имеет единственное поле с именем DUMMY типа VARCHAR2(1) и единственную запись со значением 'X' в этом поле. Что собственно гарантирует, что при её использовании в качестве источника данных будет получена только одна итоговая запись. Если не выполнять обращение именно к полю DUMMY , то при использовании FROM DUAL физического доступа к таблице не происходит ( FAST DUAL , верно для Oracle Database 10g Release 1 и старше).