一.merge into
在网上查资料得到
该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了如下改动。
1.insert 和update是可选的
2.UPDATE 和INSERT 后面可以跟WHERE 子句
3.在ON条件中可以使用常量来insert 所有的行到目标表中,不需要连接到源表和目标表
4.UPDATE 子句后面可以跟delete 来去除一些不需要的行。
我的sql是这样的:
merge into E203@LINKLJ t1
using (select JH,
SGDW,
SGDH,
LJDW,
LJDH
from SJ_LJ.E203
where swid = '00005ZphA57bT'
and jh in (select jh
from LC_DJSHXXB
where (csdwshzt <> '-1' and zgdwshzt <> '-1' and
ysdwshzt <> '-1')
and swid = '00005ZphA57bT')) t2
on (t1.JH = t2.JH)
when matched then
update
set t1.SGDW = t2.SGDW,
t1.SGDH = t2.SGDH,
t1.LJDW = t2.LJDW,
t1.LJDH = t2.LJDH
where t1.JH = t2.JH
when not matched then
insert
(JH,
SGDW,
SGDH,
LJDW,
LJDH)
values
(t2.JH,
t2.SGDW,
t2.SGDH,
t2.LJDW,
t2.LJDH)
按照上面的资料按理来说,我这个sql语句在10g和11g都是可以执行的,但是实际上是11g可运行,10g报:ora-00904:"A3"."JH":标识符无效;ora-02063......
然后我将update中的where条件去掉,就OK了。
"UPDATE 和INSERT 后面可以跟WHERE 子句 "这个好像是不对的,至于原理,不懂哦,有高手帮忙解答当然最好了,呵呵。
之前还发现不同的地方,只因当时项目紧急,没来的及记下来,待以后再续了。