Oracle SELECT FROM如何与多个字段一起工作

Dir*_*irk 0 sql oracle

这是我遇到的查询的结构:

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)
Run Code Online (Sandbox Code Playgroud)

我已经阅读了使用DUAL返回SYSDATE或其他操作... SELECT是否只是将一些输入值返回到表(行)中以简化其他子句中的进一步操作?

谢谢!

Ron*_*nis 7

您遇到的代码旨在更新单个行,或者如果它不存在则创建它.

DUAL是一个只包含一行的特殊系统表.从DUAL中选择是一种解决方法,因为Oracles无法简单地做到:

select sysdate;
Run Code Online (Sandbox Code Playgroud)

请注意,它不一定是dual,它可以是任何一行表,甚至是返回一行的查询.

select sysdate
  from dual;
Run Code Online (Sandbox Code Playgroud)

相当于:

select sysdate
  from my_one_row_table;
Run Code Online (Sandbox Code Playgroud)

select sysdate
  from my_table
 where my_primary_key = 1;
Run Code Online (Sandbox Code Playgroud)

从版本10g开始,该dual表具有一个特殊的访问路径,在执行计划中显示为"fast dual",这导致0一致的获取,这是不可能使用其他表自己实现的.

  • 实际上,SQL '92标准需要一个FROM子句.说DUAL是"解决方法......对于甲骨文无能为力"有点误导.它是"选择sysdate",是一种非标准的速记.DUAL是一个包含一行的表,并且始终存在于Oracle数据库中.参考:http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt (2认同)