[Oracle]Merge语句(二)

2015-07-24 11:23:43 · 作者: · 浏览: 14
具体如下: */ MERGE INTO T2 USING (select COUNT(*) CNT from t2 where NAME='D') T ON (T.CNT<>0) WHEN MATCHED THEN UPDATE SET T2.MONEY=100 WHEN NOT MATCHED THEN INSERT VALUES ('D',100); SQL> SELECT * FROM T2; NAME MONEY ------------------------------- A 30 C 20 D 100 5. 必须要在源表中获得一组稳定的行
---构造数据,请注意这里多插入一条A记录,就产生了ORA-30926错误
INSERT INTO T1 VALUES ('A',30);
COMMIT;

---此时继续执行如下
MERGE INTO T2
USING T1
ON (T1.NAME=T2.NAME)
WHEN MATCHED THEN
UPDATE
SET T2.MONEY=T1.MONEY+T2.MONEY;
ORA-30926: 无法在源表中获得一组稳定的行

/*
oracle中的merge语句应该保证on中的条件的唯一性,T1.NAME=T2.NAME的时候,T1表记录对应到了T2表的两条记录,所以就出错了。
解决方法很简单,比如我们可以对T1表和T2表的关联字段建主还键,这样基本上就不可能出现这样的问题,而且一般而言,MERGE语句的关联字段互相有主键,
MERGE的效率将比较高!或者是将T1表的ID列做一个聚合,这样归并成单条,也能避免此类错误。如:
*/   

MERGE INTO T2
  USING (select NAME,SUM(MONEY) AS MONEY FROM T1 GROUP BY NAME)T1
  ON (T1.NAME=T2.NAME)
  WHEN MATCHED THEN
  UPDATE
  SET T2.MONEY=T1.MONEY+T2.MONEY;

--正常情况下,一般出现重复的NAME需要引起怀疑,不太应该。