Как Oracle SELECT FROM dual работает с несколькими полями - PullRequest
0 голосов
/ 30 марта 2011

Вот структура запроса, с которым я столкнулся:

MERGE INTO TABLE t
USING (SELECT ? id, ? email, ? cr_date, ? info, ? status FROM dual) n
ON t.id=n.id and t.email=n.email
WHEN MATCHED THEN UPDATE SET z.info = n.info z.status='Y'
WHEN NOT MATCHED THEN INSERT (info, status) VALUES (n.info, n.status)

Я прочитал об использовании DUAL для возврата SYSDATE или других операций ... SELECT просто возвращает некоторые входные значения в таблицу(строка), чтобы упростить дальнейшие операции в других пунктах?

Спасибо!

Ответы [ 4 ]

7 голосов
/ 30 марта 2011

Код, с которым вы столкнулись, предназначен для обновления одной строки или ее создания, если она не существует.

DUAL - это специальная системная таблица, содержащая всего одну строку. Выбор из DUAL - это обходной путь для неспособности Oracles сделать просто:

select sysdate;

Обратите внимание, что это не обязательно должно быть dual, это может быть любая таблица из одной строки или даже запрос, который возвращает одну строку.

select sysdate
  from dual;

эквивалентно:

select sysdate
  from my_one_row_table;

и

select sysdate
  from my_table
 where my_primary_key = 1;

Начиная с версии 10g, таблица dual имеет специальный путь доступа, который отображается в плане выполнения как «быстрый двойной», что приводит к 0 последовательным получениям, которые невозможно достичь самостоятельно, используя другие таблицы .

0 голосов
/ 30 марта 2011

Читайте о ДВОЙНОЙ таблице: http://www.orafaq.com/wiki/Dual Обычно используется для SYSDATE. Может использоваться для нескольких полей, например, ниже: ВЫБЕРИТЕ ПОЛЬЗОВАТЕЛЯ, sysdate from dual;

0 голосов
/ 30 марта 2011

Похоже, что оператор выполняет обновление вставки, используя небольшой трюк с DUAL."?"кажутся переменными связывания.

Та же логика может выглядеть (в псевдокоде):

UPDATE t
SET t.id= ?,
    t.email= ?,
    t.status= 'Y'

Если обновление обновлено 0 строк, ТОГДА

INSERT into t
VALUES (?, ?) 

где два?переменные "info" и "status" соответственно.

Использование DUAL просто сокращает вашу работу до одного вызова базы данных вместо двух.

0 голосов
/ 30 марта 2011

а) Да, вы можете использовать как это утверждение. Но вы должны переименовать ваше имя поля «date», потому что это ключевое слово oracle. б) но я настоятельно рекомендую создать для этого процедуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...