0

Oracle Database 10g Enterprise Edition Release 10.1.0.5.0 - Prod を実行しています。m2 から m1 にデータをマージしたい。マージ後に m1 に 3 つのレコードが表示されることを期待しています。

しかし、私はすべてを手に入れます。あたかも更新または挿入のチェックが行われていないかのように。

下記参照。

よろしくお願いします、

フィル

 SQL> desc m1;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 K                                                  VARCHAR2(6)
 V                                                  VARCHAR2(6)
 KNT                                                NUMBER(4)

SQL> desc m2;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 K                                                  VARCHAR2(6)
 V                                                  VARCHAR2(6)
 KNT                                                NUMBER(4)

SQL> select * from m1;

no rows selected

SQL> select * from m2;

K      V             KNT
------ ------ ----------
a      aaa             0
b      bbb             0
c      ccc             0
c      ccc             0
c      ccc             0
a      aaa             0
b      bbb             0
c      ccc             0
c      ccc             0


SQL> merge into m1 d
  2  using (select k,v,knt from m2) s

 SQL> desc m1;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 K                                                  VARCHAR2(6)
 V                                                  VARCHAR2(6)
 KNT                                                NUMBER(4)

SQL> desc m2;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 K                                                  VARCHAR2(6)
 V                                                  VARCHAR2(6)
 KNT                                                NUMBER(4)

SQL> select * from m1;

no rows selected

SQL> select * from m2;

K      V             KNT
------ ------ ----------
a      aaa             0
b      bbb             0
c      ccc             0
c      ccc             0
c      ccc             0
a      aaa             0
b      bbb             0
c      ccc             0
c      ccc             0


SQL> merge into m1 d
  2  using (select k,v,knt from m2) s
  3  on (d.k = s.k)
  4  when matched then
  5  update set d.knt = d.knt+1
  6  when not matched then
  7  insert(d.k,d.v,d.knt)
  8  values(s.k,s.v,s.knt)
  9  ;

SQL> select * from m1;

K      V             KNT
------ ------ ----------
b      bbb             0
b      bbb             0
c      ccc             0
c      ccc             0
c      ccc             0
c      ccc             0
c      ccc             0
a      aaa             0
a      aaa             0
4

2 に答える 2

3

本当にMERGEが必要ですか? 本当に欲しいらしい

INSERT INTO m2( k, v, knt )
  SELECT k, v, count(*)
    FROM m1
   GROUP BY k, v

MERGE はセットベースの操作です。M2 のデータはクエリの実行時に評価されるため、USING句は の一部として挿入される行を認識しませんMERGE。このUSING句は 0 行を返すため、 からのすべてのデータM1が に挿入されM2ます。WHEN MATCHED句がトリガーされることはありません。

于 2011-11-04T17:05:00.033 に答える
1

はぁ。挿入しているレコードを「個別」に保持する必要があるようです。

したがって、これは機能します。.... すこし。

 merge into m1 d
 using (select distinct k,v,knt from m2) s
 on (d.k = s.k and d.v = s.v)
 when matched then
 update set d.knt = d.knt+1
 when not matched then
 insert(d.k,d.v,d.knt)
 values(s.k,s.v,s.knt)
于 2011-11-07T17:02:00.897 に答える