最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

oraclemerge误区

来源:动视网 责编:小采 时间:2020-11-09 07:18:15
文档

oraclemerge误区

oraclemerge误区:1、 如果在d1表中有一个字段有多个,并且在使用merge是使用该字段关联会产生ORA-30926的错误,如在上一节面我们使用相关联的字段是deptno,如果在d1中出现多行deptno的一样就会报错。 --构造实验环境(延续上一节的d1、d2表)SQL update d1
推荐度:
导读oraclemerge误区:1、 如果在d1表中有一个字段有多个,并且在使用merge是使用该字段关联会产生ORA-30926的错误,如在上一节面我们使用相关联的字段是deptno,如果在d1中出现多行deptno的一样就会报错。 --构造实验环境(延续上一节的d1、d2表)SQL update d1


1、 如果在d1表中有一个字段有多个,并且在使用merge是使用该字段关联会产生ORA-30926的错误,如在上一节面我们使用相关联的字段是deptno,如果在d1中出现多行deptno的一样就会报错。 --构造实验环境(延续上一节的d1、d2表)SQL update d1 set deptno = 10

1、如果在d1表中有一个字段有多个,并且在使用merge是使用该字段关联会产生ORA-30926的错误,如在上一节面我们使用相关联的字段是deptno,如果在d1中出现多行deptno的值一样就会报错。

--构造实验环境(延续上一节的d1、d2表)
SQL> update d1 set deptno = 10 where deptno = 30;
1 row updated.

SQL> select * from d1;
 DEPTNO DNAME LOC
---------- -------------- -------------
 10 ACCOUNTING NEW YORK
 20 RESEARCH DALLAS
 10 SALES CHICAGO
 40 OPERATIONS BOSTON
2、执行merge操作,使用d1表的记录去更新d2表的记录,查看结果
MERGE INTO d2
USING d1
ON (d1.deptno = d2.deptno)
WHEN MATCHED THEN
 UPDATE SET d2.loc = d1.loc || '...';
	
USING d1
 *
ERROR at line 2:
ORA-30926: unable to get a stable set of rows in the source tables
从上面得到的错误:没有稳定值。可以得出在 ON() 子句中的条件是d1.deptno = 10不具备有唯一性,所以建议在关联的列上创建主键或者创建unique index。还有一个解决办法就是将值相等的行合并成一行来处理(请注意:这样做可能会改变需求)。

3、如果将d1和d2倒过来(使用d2的记录去更新d2的记录)就不会发生ORA-30926,原因是在d2中的deptno的值是唯一。

MERGE INTO d1
USING d2
ON (d1.deptno = d2.deptno)
WHEN MATCHED THEN
 UPDATE set d1.loc = d2.loc || '...'
	
SQL> select * from d1;
 DEPTNO DNAME LOC
---------- -------------- -------------
 10 ACCOUNTING FU JIAN...
 20 RESEARCH DALLAS
 10 SALES FU JIAN...
 40 OPERATIONS BOSTON
4、delete子句的where必须在最后
--环境
SQL> select * from d1;

 DEPTNO DNAME LOC
---------- -------------- -------------
 10 ACCOUNTING NEW YORK
 20 RESEARCH DALLAS
 30 SALES CHICAGO
 40 OPERATIONS BOSTON

SQL> select * from d2;

 DEPTNO DNAME LOC
---------- -------------- -------------
 10 ACCOUNTING FU JIAN
 30 SALES CHICAGO
	
--错误示例
MERGE INTO d2
USING d1
ON (d1.deptno = d2.deptno)
WHEN MATCHED THEN
 UPDATE SET d2.loc = d1.loc || '...'
 DELETE WHERE (d2.deptno = 10)
 WHERE d1.deptno = 10;
	
 WHERE d1.deptno = 10
 *
ERROR at line 7:
ORA-00933: SQL command not properly ended

--正确示例
MERGE INTO d2
USING d1
ON (d1.deptno = d2.deptno)
WHEN MATCHED THEN
 UPDATE SET d2.loc = d1.loc || '...'
 WHERE d1.deptno = 10
 DELETE WHERE (d2.deptno = 10);
5、在delete 子句只可以伤处目标表,而不能删除源表,以上实验中我们用的都是delete where (d1.deptno)。

SQL> select * from d1;

 DEPTNO DNAME LOC
---------- -------------- -------------
 10 ACCOUNTING NEW YORK
 20 RESEARCH DALLAS
 30 SALES CHICAGO
 40 OPERATIONS BOSTON

SQL> select * from d2;

 DEPTNO DNAME LOC
---------- -------------- -------------
 10 ACCOUNTING FU JIAN
 30 SALES CHICAGO

--DELETE WHERE (d1.deptno = 10)
MERGE INTO d2
USING d1
ON (d1.deptno = d2.deptno)
WHEN MATCHED THEN
 UPDATE SET d2.loc = d1.loc || '...'
 DELETE WHERE (d1.deptno = 10)	
	
SQL> select * from d2;

 DEPTNO DNAME LOC
---------- -------------- -------------
 30 SALES CHICAGO...	

SQL> rollback;
Rollback complete.	

--使用DELETE WHERE (d2.deptno = 10)
MERGE INTO d2
USING d1
ON (d1.deptno = d2.deptno)
WHEN MATCHED THEN
 UPDATE SET d2.loc = d1.loc || '...'
 DELETE WHERE (d2.deptno = 10)	
	
SQL> select * from d2;
 DEPTNO DNAME LOC
---------- -------------- -------------
 30 SALES CHICAGO...
6、merge当引用表中没数据的解决办法

SQL> select * from d1;
no rows selected

SQL> select * from d2;
 DEPTNO DNAME LOC
---------- -------------- -------------
 10 ACCOUNTING FU JIAN
 30 SALES CHICAGO
	
MERGE INTO d2
USING d1
ON (d1.deptno = d2.deptno)
WHEN MATCHED THEN
 UPDATE SET d2.loc = 'AAAAA'
WHEN NOT MATCHED THEN
 INSERT VALUES(20, 'aaaaa', 'AAAAA')

0 rows merged.

SQL> select * from d2;
 DEPTNO DNAME LOC
---------- -------------- -------------
 10 ACCOUNTING FU JIAN
 30 SALES CHICAGO
按道理说:当d1中没有找到数据时应该会执行INSERT语句的。但是,从上可以看到并没有执行INSERT语句。我们可以这样取巧的使用让他实行INSERT语句:

MERGE INTO d2
USING (SELECT COUNT(*) CNT FROM d1) d
ON (d.cnt <> 0)
WHEN MATCHED THEN
 UPDATE SET d2.loc = 'AAAAA'
WHEN NOT MATCHED THEN
 INSERT VALUES(20, 'aaaaa', 'AAAAA')
	
SQL> select * from d2;
 DEPTNO DNAME LOC
---------- -------------- -------------
 10 ACCOUNTING FU JIAN
 30 SALES CHICAGO
 20 aaaaa AAAAA

文档

oraclemerge误区

oraclemerge误区:1、 如果在d1表中有一个字段有多个,并且在使用merge是使用该字段关联会产生ORA-30926的错误,如在上一节面我们使用相关联的字段是deptno,如果在d1中出现多行deptno的一样就会报错。 --构造实验环境(延续上一节的d1、d2表)SQL update d1
推荐度:
标签: 有一个 如果 表中
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top