Это работает в основных системах управления базами данных Relation, которые чаще всего появляются в StackOverflow / dba.stackexchange, а именно в SQL Server, MySQL, PostgreSQL и SQLite (WebSQL) .
select 'abc' abc, 1 def;
Это не работает на Oracle. Почему нам нужно выбрать из DUAL в Oracle? Требует ли стандарт ISO / ANSI для SQL условия FROM для операторов SELECT ?
Редактировать:
За Bacon Bit
ответ «S, это , кажется , требуется стандартом SQL.
Так что на самом деле, потому что имя DUAL является таким неправильным, если бы я создал таблицу и назвал ее ATOM или ONE, например create table one (atom int);
... select 'abc' abc, 1 def FROM one;
- Есть ли снижение производительности по сравнению с SELECT .. FROM DUAL
?
select
безfrom
. В DB2 есть аналогичная фиктивная таблица SYSIBM.SYSDUMMY1 . Кроме того, вы, вероятно, уже знаете это, но когда выselect 'A' from dual
, кdual
таблице, на самом деле нет доступа , что отвечает на вопрос в вашем редактировании (который заслуживает нового вопроса между прочим).FROM
пункт. Сверху головы: Informix, Firebird и Apache Derby также требуют этого.values ('abc', 1)
. Можно, конечно, также выбрать из такого утверждения:select abc from ( values ('abc',1) ) as t(abc,def)
Ответы:
Строго говоря, да,
FROM
предложениеSELECT
не является обязательным. Синтаксис для SQL-99 детализирует основнуюSELECT
статистику, и вFROM
предложении нет квадратных скобок. Это означает, что стандарт считает его необязательным:При реальном использовании программисты и администраторы баз данных часто считают полезным делать что-то, кроме манипулирования данными в таблицах или манипулирования таблицами и структурами данных. Этот тип вещей в значительной степени выходит за рамки стандарта SQL, который связан с функциями данных больше, чем суть конкретных реализаций. Хотим ли мы запускать
SELECT getdate()
илиSELECT 1
илиSELECT DB_NAME()
(или как бы вы ни предпочитали ваш диалект), нам на самом деле не нужны данные из таблицы.Oracle решает проблему несоответствия стандарту и реализации с использованием фиктивной таблицы со следующим эффективным определением:
Другие РСУБД по существу предполагают, что используется фиктивная таблица, если не
FROM
указано иное.История DUAL таблицы на Википедии:
источник
Преимущество,
dual
которое понимает оптимизатор,dual
- это специальная таблица из одной строки и одного столбца (сvarchar2
типом данных) - когда вы используете ее в запросах, он использует эти знания при разработке плана.Почему нам нужно выбрать из
dual
в Oracle?Вы можете выбрать из
dual
или из ваших собственных таблиц, вы можете, если хотите.Для меня я буду придерживаться,
dual
потому что я знаю, чтоdual
существует. Я знаю, что у него есть как минимум 1 и максимум 1 ряд. Я знаю, что оптимизатор знает всеdual
и делает для меня самое эффективное. Оптимизатор понимает,dual
что это волшебная специальная таблица из 1 строки. Он остановился на том,select *
что там должен быть один ряд. Так что это так, как это работает.источник
DUAL
. Быть осторожен!Два других ответа обеспечивают хороший фон для моего ответа.
На базах данных Oracle это традиционно и надежно. Это не удастся на других базах данных, которые не имеют
DUAL
таблицы. Это не обязательно, что вы используетеDUAL
, но я бы порекомендовал вам сделать.Для совместимых со стандартами баз данных потребуется
FROM
пункт, в котором будет указана хотя бы ссылка на таблицу. Если у вас есть таблицаFROM DUAL
ORDERS, сработает следующая замена для этого предложения:Замените любую таблицу или представление, из которого вы можете выбрать, и это будет работать. Замените таблицу или представление, из которого вы не можете выбрать, и это не удастся.
DUAL
является более надежным, так как запрещает администратору базы данных нарушать его, все пользователи могут выбирать из него и получат только одну строку в наборе результатов. (Это иногда ломается.)Мне неизвестен глагол, соответствующий стандартам, для доступа к данным, которых нет в таблице без ссылки на таблицу. Учитывая, как мало я получаю доступ к таким данным, я не вижу такой необходимости. Во многих случаях, с которыми я сталкиваюсь, лучше разбираться по-разному.
источник
SELECT CURRENT_TIMESTAMP FROM (VALUES(1)) V(C)
я верю стандарту и не полагаюсь ни на какой конкретный стол.