以下是我遇到的查询结构:
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是否只是将一些输入值返回到表(行)中以简化其他子句中的进一步操作?
谢谢!
答案 0 :(得分:7)
您遇到的代码是为了更新单个行,或者如果它不存在则创建它。
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
表有一个特殊的访问路径,在执行计划中显示为“fast dual”,这导致0一致的获取,这是不可能自己使用其他表格。
答案 1 :(得分:0)
a)是的,您可以像这样的陈述一样使用。但是您必须重命名“date”字段名称,因为它的关键字是oracle。 b)但我强烈建议为此创建程序。
答案 2 :(得分:0)
了解DUAL表:http://www.orafaq.com/wiki/Dual 它常用于SYSDATE,也可用于以下多个字段: SELECT USER,sysdate来自dual;
答案 3 :(得分:0)
该声明似乎基本上是使用DUAL的小技巧进行更新Else插入。 “?”似乎是绑定变量。
相同的逻辑可能看起来像(在伪代码中):
UPDATE t
SET t.id= ?,
t.email= ?,
t.status= 'Y'
如果更新更新0行那么
INSERT into t
VALUES (?, ?)
两个在哪里?分别是“信息”和“状态”变量。
使用DUAL只会将您的工作减少到一个数据库调用,而不是两个。