简体   繁体   English

我们如何在单个合并中进行更新,删除,插入

[英]How can we do update,delete,insert in single merge

I have a source and target table. 我有一个源表和目标表。 I was doing a simple merge where I was able to do insert and update operation simultaneously. 我正在做一个简单的合并,可以同时进行插入和更新操作。 I just added columns like insert date and update date to know when the record is inserted and updated. 我只是添加了诸如插入日期和更新日期之类的列,以了解何时插入和更新记录。 Then, I also added a flag columns which tells us that if the record is ever updated if yes then 'Y' else 'N'. 然后,我还添加了一个标志列,告诉我们记录是否曾经更新过(如果是),则为“ Y”,否则为“ N”。 I was successful till this but when I tried to use delete it doesn't allow me.I have seen many solutions in sql server but mine is oracle. 在此之前我一直很成功,但是当我尝试使用delete时却不允许我这样做。我在sql server中看到过许多解决方案,但我的是oracle。 I was doing a soft delete in which the record is not deleted from the target but just the flag column is updated to 'Y' if some record is deleted from the source table. 我正在做一个软删除,如果从源表中删除了一些记录,则不会从目标中删除记录,而只是将标志列更新为“ Y”。 But I was not able to do that. 但是我无法做到这一点。 I used case also but of no use.To be clear I just want to update flag when there is delete in source. 我也使用了大小写,但没有用。要清楚,我只想在源代码中有删除时更新标志。 Can anybody tell me how can I do that with single merge statement? 有人可以告诉我如何使用单个merge语句吗? I have simple table student having attribute like name,address mobile no , state. 我有一个简单的表格学生,具有名称,地址移动号,状态之类的属性。 I have made my query like this- 我已经这样查询我了-

 merge into target t using (SELECT CASE WHEN S.STUDENT_ID IS NULL THEN T.STUDENT_ID ELSE S.STUDENT_ID END 
AS STUDENT_ID,S.NAME,S.ADRESS,S.STATE,S.MOBILE FROM STUDENTS S full JOIN TARGET T ON S.STUDENT_ID=T.STUDENT_ID) s
on (s.student_id = t.student_id)
when not matched then insert (student_id,name,address,state,mobile,insert_date,update_date)
values(s.student_id,s.name,s.adress,s.state,s.mobile,sysdate,sysdate)

when matched then update set t.name=s.name,t.address=s.adress, t.state=s.state,t.mobile=s.mobile,update_date=sysdate
where s.name!=t.name or s.adress!=t.address or s.state!=t.state or s.mobile!=t.mobile;

this time I used case with every attribute and I am able to solve it but every time I run it it shows the no of extra rows present in target merged like - 4 rows are merged I dont want that can anyone help my query is- 这次我对每个属性都使用case,并且我能够解决它,但是每次运行它时,它都显示合并的目标中没有多余的行,例如-合并了4行,我不希望有人能帮助我查询吗-

 MERGE INTO TARGET T USING (SELECT CASE WHEN S.STUDENT_ID IS NULL THEN T.STUDENT_ID ELSE S.STUDENT_ID END 
AS STUDENT_ID,S.NAME,S.ADRESS,S.STATE,S.MOBILE FROM STUDENTS S FULL JOIN TARGET T ON S.STUDENT_ID=T.STUDENT_ID) S
ON (S.STUDENT_ID=T.STUDENT_ID)
WHEN NOT MATCHED THEN INSERT 
(STUDENT_ID,NAME,ADDRESS,STATE,MOBILE,INSERT_DATE,UPDATE_DATE,FLAG )
VALUES(S.STUDENT_ID,S.NAME,S.ADRESS,S.STATE,S.MOBILE,SYSDATE,SYSDATE, 'N')
WHEN MATCHED THEN UPDATE SET T.FLAG='Y' , t.name = case when s.name is null then T.NAME else S.name end ,
T.ADDRESS=case when s.ADRESS is null then T.ADDRESS else S.ADRESS end ,
t.STATE=case when s.STATE is null then T.STATE else S.STATE end ,
T.MOBILE=CASE WHEN S.MOBILE IS NULL THEN T.MOBILE ELSE S.MOBILE END
WHERE S.NAME!=T.NAME OR S.ADRESS!=T.ADDRESS OR S.STATE!=T.STATE OR S.MOBILE!=T.MOBILE or t.STUDENT_ID in
(SELECT TARGET.STUDENT_ID FROM 
STUDENTS FULL JOIN TARGET ON STUDENTS.STUDENT_ID=TARGET.STUDENT_ID WHERE STUDENTS.STUDENT_ID IS NULL);

Answer to my question- 回答我的问题

 MERGE INTO TARGET T USING
  (SELECT CASE
              WHEN S.STUDENT_ID IS NULL THEN T.STUDENT_ID
              ELSE S.STUDENT_ID
          END AS STUDENT_ID,
                 S.NAME,
                 S.ADRESS,
                 S.STATE,
                 S.MOBILE
   FROM STUDENTS S
   FULL JOIN TARGET T ON S.STUDENT_ID=T.STUDENT_ID) S ON (S.STUDENT_ID=T.STUDENT_ID) WHEN NOT MATCHED THEN
INSERT (STUDENT_ID,
        NAME,
        ADDRESS,
        STATE,
        MOBILE,
        INSERT_DATE,
        UPDATE_DATE,
        FLAG)
VALUES(S.STUDENT_ID,
       S.NAME,
       S.ADRESS,
       S.STATE,
         S.MOBILE,
         SYSDATE,
         SYSDATE,
         'N') WHEN MATCHED THEN
UPDATE
SET T.FLAG= CASE 
               WHEN ( T.STUDENT_ID IN (SELECT TARGET.STUDENT_ID
     FROM STUDENTS
     FULL JOIN TARGET ON STUDENTS.STUDENT_ID=TARGET.STUDENT_ID
     WHERE STUDENTS.STUDENT_ID IS NULL)) THEN 'Y'
               ELSE 'N'
               END,

    T.NAME = CASE
                 WHEN S.NAME IS NULL THEN T.NAME
                 ELSE S.NAME
             END,
             T.ADDRESS=CASE
                           WHEN S.ADRESS IS NULL THEN T.ADDRESS
                           ELSE S.ADRESS
                       END,
                       T.STATE=CASE
                                   WHEN S.STATE IS NULL THEN T.STATE
                                   ELSE S.STATE
                               END,
                               T.MOBILE=CASE
                                            WHEN S.MOBILE IS NULL THEN T.MOBILE
                                            ELSE S.MOBILE
                                        END,
                                        T.UPDATE_DATE=SYSDATE ,
                                        T.INSERT_DATE=SYSDATE

WHERE S.NAME!=T.NAME
  OR S.ADRESS!=T.ADDRESS
  OR S.STATE!=T.STATE
  OR S.MOBILE!=T.MOBILE
  OR T.STUDENT_ID IN
    (SELECT TARGET.STUDENT_ID
     FROM STUDENTS
     FULL JOIN TARGET ON STUDENTS.STUDENT_ID=TARGET.STUDENT_ID
     WHERE STUDENTS.STUDENT_ID IS NULL)
  AND FLAG!='Y';

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM