Mysql:

INSERT INTO YZZH_CBDJ(YCXXWYBZ)

   SELECT  YCXXWYBZ

   FROM

   YZZH_CBDJ_I  A

   WHERE DATE_FORMAT(A.CJSJ,’%Y-%m-%d’)=DATE_FORMAT(NOW(),’%Y-%m-%d’ ) AND HXFW!=” 

    ON DUPLICATE KEY

   UPDATE        

    HXFW = A.HXFW

上面的SQL运用了insert into …select…from …on duplicate key update [需要更新的字段],大概意 思是 将select出来的内容insert到需要insert的表中,如果主键存在就进行更新操作,否则进行insert操 作,是 一个功能颇为强大的一个sql语句。

Oracle:

merge的用法

语法:merge into [your table-name] [rename your table here]

USING ( [write your query here] )[rename your query-sql and using just like a table]

ON ([conditional])

when matched then [here you can execute some update sql or something else ]

when not matched then [execute something else here ! ]

例子:merge into products p using newproducts np on (p.product_id = np.product_id)

when matched then

update set p.product_name = np.product_name

when not matched then

insert values(np.product_id, np.product_name, np.category)

在这个例子里。前面的merger into products using newproducts表示的用newproducts表 来merge 到products表,merge的匹 配关系就是on后面的条件子句的内容,这里根据两个表的 product_id来进行匹配,那么匹 配 上 了我们的操作是就是when matched then的子句里的动作了,这里 的动作是update set p.product_name = np.product_name, 很显然就是把newproduct里的内容,赋值 到product的product_name里。如果没有匹配上则insert这样的一条语句进去。这里merger的功能,好比 比较,然后选择更新或者是插入,是一系列的组合拳,在做merge的时候,这样同样的情况下,merge的 性能是优于同等功能的update/insert语句的。我们也可以在using后面使用视图或者子查询。比如我们把 newproducts换成

merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name
when not matched then
insert values(np.product_id, np.product_name, np.category)

也是可以的。
在Oracle 10g中MERGE有如下一些改进:
1、UPDATE或INSERT子句是可选的
2、UPDATE和INSERT子句可以加WHERE子句
3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行

我们通过实例来一一看看如上的新特性

1. UPDATE或INSERT子句是可选的
在9i里由于必须insert into和update都要存在,也就是不是update就是insert,不支持单一的操作,虽然 还是可以曲线救国,呵呵 但是有些过于强势了。而10g里就是可选了,能符合我们更多的需求了
比如上面的句子
我们可以只存在update或者insert
merge into products p using newproducts np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name
这里,如果匹配就更新,不存在就不管了。

2. UPDATE和INSERT子句可以加WHERE子句
这也是一个功能性的改进,能够符合我们更多的需求,这个where的作用很明显是一个过滤的条件, 是我们 加入一些额外的条件,对只对满足where条件的进行更新和insert
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name where np.product_name like ‘OL%’
这里表示只是对product_name开头是’OL’的匹配上的进行update,如果开头不是’OL’的就是匹配了也不做 什么事情,insert里也可以加入where
比如
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name where np.product_name like ‘OL%’
when not matched then
insert values(np.product_id, np.product_name, np.category) where np.product_name like ‘OL%’

这里注意比较一下,他们返回的结果行数,是有着差异的。

3. 在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表

merge into products p using (select * from newproducts) np on (1=0)
when matched then
update set p.product_name = np.product_name
when not matched then
insert values(np.product_id, np.product_name, np.category)
个人觉得这个功能没有太大的意义,我们的insert into本身就支持这样的功能,没有必要使用merge

4. UPDATE子句后面可以跟DELETE子句来去除一些不需要的行
delete只能和update配合,从而达到删除满足where条件的子句的纪录
merge into products p using (select * from newproducts) np on (p.product_id = np.product_id)
when matched then
update set p.product_name = np.product_name delete where p.product_id = np.product_id where np.product_name like ‘OL%’
when not matched then
insert values(np.product_id, np.product_name, np.category)
这里我们达到的目的就是 会把匹配的记录的prodcut_name更新到product里,并且把product_name开 头为OL的删除掉。

merge into也是一个dml语句,和其他的dml语句一样需要通过rollback和commit 结束事务。