merge into 表1
using 表2 ,表3
on 表1.字段1=表2.字段1  and 表2.字段2=表3.字段1
 WHEN MATCHED THEN 
   UPDATE SET
 WHEN NOT MATCHED THEN 
  INSERT INTO()values();
这样写 有问题吗?还有我除了 insert 表1  我还想insert into 表4(其他的表)  可以吗?
请帮忙解决下

解决方案 »

  1.   

    Merge   命令可以用来用一个表中的数据来修改或者插入到另一个表。插入或者修改的操作取决于ON子句的条件。 
    该语句可以在同一语句中执行两步操作,可以减少执行多条INSERT   和UPDATE语句。MERGE是一个确定性的语句,
    即不会在同一条MERGE语句中去对同一条记录多次做修改操作。 
    关键字、参数 
    INTO   子句 
    在INTO子句中指定所要修改或者插入数据的目标表 USING   子句 
    在USING子句中指定用来修改或者插入的数据源。数据源可以是表、视图或者一个子查询语句。 ON   子句 
    在ON子句中指定执行插入或者修改的满足条件。在目标表中符合条件的每一行,ORACLE用数据源中的相应数据修改这些行。
    对于不满足条件的那些行,ORACLE则插入数据源中相应数据。 WHEN   MATCHED   |   NOT   MATCHED   
    用该子句通知ORACLE如何对满足或不满足条件的结果做出相应的操作。可以使用以下的两类子句。 
    merge_update子句   
    MERGE_UPDATE子句执行对目标表中的字段值修改。当在符合ON子句条件的情况下执行。如果修改子句执行,则目标表上的修改触发器将被触发。 
    限制:当修改一个视图时,不能指定一个DEFAULT值 
    merge_insert   子句   
    MERGE_INSERT子句执行当不符合ON子句条件时,往目标表中插入数据。如果插入子句执行,则目标表上插入触发器将被触发。 限制:当修改一个视图时,不能指定一个DEFAULT值 
      

  2.   

    范例 
    MERGE   范例 
    下面的例子在OE模式下创建一个BONUSES表,BONUS的缺省值为100。然后插入BONUSES表所有有成绩的销售人员(基于OE_ORDERS表的SQLES_REP_ID字段)。
    最后,人力资源管理人员决定,所有的人员将得到分红。没有销售成绩的员工得到工资的1%的分红,而那些有销售成绩的员工将得到缺省分红以及工资的1%。
    可以用一条MERGE语句将完成上述修改:   
    CREATE   TABLE   bonuses   (employee_id   NUMBER,   bonus   NUMBER   DEFAULT   100);   
    INSERT   INTO   bonuses(employee_id)   
    (SELECT   e.employee_id   FROM   employees   e,   orders   o   
    WHERE   e.employee_id   =   o.sales_rep_id   
    GROUP   BY   e.employee_id);   
    SELECT   *   FROM   bonuses;   
    EMPLOYEE_ID   BONUS   
    -----------   ----------   
    153   100   
    154   100   
    155   100   
    156   100   
    158   100   
    159   100   
    160   100   
    161   100   
    163   100   
    MERGE   INTO   bonuses   D   
    USING   (SELECT   employee_id,   salary,   department_id   FROM   employees   
    WHERE   department_id   =   80)   S   
    ON   (D.employee_id   =   S.employee_id)   
    WHEN   MATCHED   THEN   UPDATE   SET   D.bonus   =   D.bonus   +   S.salary*.01   
    WHEN   NOT   MATCHED   THEN   INSERT   (D.employee_id,   D.bonus)   
    VALUES   (S.employee_id,   S.salary*0.01);   
    EMPLOYEE_ID   BONUS   
    -----------   ----------   
    153   180   
    154   175   
    155   170   
    156   200   
    158   190   
    159   180   
    160   175   
    161   170   
    163   195   
    157   95   
    145   14   
    170   96   
    179   62   
    152   90   
    169   100   
      

  3.   

    不行,这个只能是对一张表进行merge,不能是两张表。
    为什么不写两条merge呢
      

  4.   

    我想写2次merge   可是 我们的需求是2张表对应一张表 就是2张表中抽取字段给那一张表 
      

  5.   

    那你自己写的那个就可以啊,using里面写个union all不就可以了
      

  6.   

    create table CPS_CARDPRODUCT
    (
      BANKORG_ID                  NUMBER(10) not null,//1001
      CARD_PRODUCT_ID             VARCHAR2(10) not null,//product.PR_PRODCT_CD
      CARD_PRODUCT_NAME           VARCHAR2(40) not null, //product.PR_DESC
      CARDBRAND_ID                CHAR(1) not null,//prdgrp.PR_CARD_BRAND
      NEWCARD_ACTIVATION_IND      CHAR(1) not null,//prdgrp.PR_NEW_CARD_ACTIVATION
      REPLCARD_ACTIVATION_IND     CHAR(1) not null,//prd.PR_REPLC_CARD_ACTIVATION
      RENEWAL_CARD_ACTION_IND     CHAR(1) not null,//Y
      REISSUE_CARD_ACTIVATION_IND CHAR(1) not null,//prdgrp.PR_REISSUE_CARD_ACTIVATION
      NEWCARD_VALID_PERIOD        NUMBER(3) not null,//prdgrp.PR_NEW_CARD_VALID_PRD
      RENEWALCARD_VALID_PERIOD    NUMBER(3) not null,//prdgrp.PR_RENEWAL_VALID_PRD
      CARDPROD_GROUP_ID           VARCHAR2(10),  //PR_PRODCT_GROUP
      MODI_DATE                   DATE,//product.PR_MOD_DATE
      MODI_USER                   VARCHAR2(64),//product.PR_USER_ID
      VERSION                     NUMBER(8),
    constraint PK_CPS_CRDPRD primary key (BANKORG_ID, CARD_PRODUCT_ID)
    );
      

  7.   

    product 是卡表 prdgrp卡组表
      

  8.   

    本来是卡表到卡表的  但是product老卡表中 有卡组id和卡组表对应 我想要关联老卡表和老卡组表  然后把一些数据 查出来 放到新的卡表中
      

  9.   

    MERGE INTO 新卡表 D
    USING (select  字段 from 老卡表,卡组表 where 关联条件) S   
    ON (D和S的关联条件)   
    WHEN MATCHED THEN UPDATE SET (D字段列表) values()  
    WHEN NOT MATCHED THEN INSERT (D字段列表)   
    VALUES ();   
      

  10.   

    恩 楼上方法我在试试  我是用比较土的办法 建立了一张临时表 搞定的  2次merge一下 
      

  11.   

    3Q minitoy 分给你了