• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Prayer

            在一般中尋求卓越
            posts - 1256, comments - 190, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            DB2 Merge語句

            Posted on 2011-10-18 15:42 Prayer 閱讀(798) 評論(0)  編輯 收藏 引用 所屬分類: 數據庫,SQLDB2
            DB2 Merge語句是經常可以用到的DB2語句,下面對DB2 Merge語句作了詳細的介紹,如果您對此方面感興趣的話,不妨一看。

              DB2 Merge語句的作用非常強大,它可以將一個表中的數據合并到另一個表中,在合并的同時可以進行插入、刪除、更新等操作。我們還是先來看個簡單的例子吧,假設你定義了一個雇員表(employe),一個經理表(manager),如下所示:

              ---雇員表(EMPLOYE)

            以下是代碼片段:
                CREATE TABLE EMPLOYE (
              EMPLOYEID INTEGER NOT NULL,---員工號
              NAME VARCHAR(20) NOT NULL,---姓名
              SALARY DOUBLE---薪水
              );
              INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY) VALUES
              (1,'張三',1000),
              (2,'李四',2000),
              (3,'王五',3000),
              (4,'趙六',4000),
              (5,'高七',5000);

              --經理表(MANAGER)

            以下是代碼片段:
                CREATE TABLE MANAGER (
              EMPLOYEID INTEGER NOT NULL,---經理號
              NAME VARCHAR(20) NOT NULL,---姓名
              SALARY DOUBLE---薪水
              );
              INSERT INTO MANAGER (MANAGERID,NAME,SALARY) VALUES
              (3,'王五',5000),
              (4,'趙六',6000);

              ---雇員表(EMPLOYE)

            以下是代碼片段:
                CREATE TABLE EMPLOYE (
              EMPLOYEID INTEGER NOT NULL,---員工號
              NAME VARCHAR(20) NOT NULL,---姓名
              SALARY DOUBLE---薪水
              );
              INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY) VALUES
              (1,'張三',1000),
              (2,'李四',2000),
              (3,'王五',3000),
              (4,'趙六',4000),
              (5,'高七',5000);

              --經理表(MANAGER)

            以下是代碼片段:
                CREATE TABLE MANAGER (
              EMPLOYEID INTEGER NOT NULL,---經理號
              NAME VARCHAR(20) NOT NULL,---姓名
              SALARY DOUBLE---薪水
              );
              INSERT INTO MANAGER (MANAGERID,NAME,SALARY) VALUES
              (3,'王五',5000),
              (4,'趙六',6000);

             經過一段時間,你發現這樣的數據模型,或者說表結構設計簡直就是一大敗筆,經理和雇員都是員工嘛,為什么要設計兩個表呢?發現錯誤后就需要改正,所以你決定,刪除經理表(MANAGER)表,將MANAGER 表中的數據合并到EMPLOYE 表中,仔細分析發現,王五在兩個表中都存在(可能是干的好升官了),而劉八在EMPLOYE 表中并不存在,現在,我們要求把EMPLOYE 表中不存在的MANAGER都插入到EMPLOYE 表中,存在的更新薪水。該怎么辦呢?這個問題并不難,通常,我們可以分兩步,如下所示:

              --更新存在的

            以下是代碼片段:
                UPDATE EMPLOYE AS EM SET SALARY=(SELECT SALARY FROM MANAGER WHERE MANAGERID=EM.EMPLOYEID)
              WHERE EMPLOYEID IN (
              SELECT MANAGERID FROM MANAGER
              );

              ---插入不存在的

            以下是代碼片段:
                INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY)
              SELECT MANAGERID,NAME,SALARY FROM MANAGER WHERE MANAGERID NOT IN (
              SELECT EMPLOYEID FROM EMPLOYE
              );

              --更新存在的

            以下是代碼片段:
                UPDATE EMPLOYE AS EM SET SALARY=(SELECT SALARY FROM MANAGER WHERE MANAGERID=EM.EMPLOYEID)
              WHERE EMPLOYEID IN (
              SELECT MANAGERID FROM MANAGER
              );

              ---插入不存在的

            以下是代碼片段:
                INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY)
              SELECT MANAGERID,NAME,SALARY FROM MANAGER WHERE MANAGERID NOT IN (
              SELECT EMPLOYEID FROM EMPLOYE
              );

              上面的處理是可以的,但是我們還可以有更簡單的方法,就是用Merge語句,如下所示:

            以下是代碼片段:
                MERGE INTO EMPLOYE AS EM
              USING MANAGER AS MA
              ON EM.EMPLOYEID=MA.MANAGERID
              WHEN MATCHED THEN UPDATE SET EM.SALARY=MA.SALARY
              WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY);
              MERGE INTO EMPLOYE AS EM
              USING MANAGER AS MA
              ON EM.EMPLOYEID=MA.MANAGERID
              WHEN MATCHED THEN UPDATE SET EM.SALARY=MA.SALARY
              WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY);

             


             在上面的處理中,我們用經理表(MANAGER)的薪水更新了雇員表(EMPLOYE)的薪水,假設現在要求,如果經理表(MANAGER)的薪水>雇員表(EMPLOYE)的薪水的時候更新,否則不更新,怎么辦呢?如下:

            以下是代碼片段:
                MERGE INTO EMPLOYE AS EM
              USING MANAGER AS MA
              ON EM.EMPLOYEID=MA.MANAGERID
              WHEN MATCHED AND EM.SALARY
              WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY);
              MERGE INTO EMPLOYE AS EM
              USING MANAGER AS MA
              ON EM.EMPLOYEID=MA.MANAGERID
              WHEN MATCHED AND EM.SALARY
              WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY);

              不仔細的朋友可能沒有看出上面兩條語句的區別,哈哈,請仔細對比一下這兩條語句。上面的語句中多了ELSE IGNORE語句,它的意思正如它英文的意思,其它情況忽略不處理。如果你認為理論上應該不存在EM.SALARY>MA.SALARY的數據,如果有,說明有問題,你想拋個異常,怎么辦?如下:

            以下是代碼片段:
                MERGE INTO EMPLOYE AS EM
              USING MANAGER AS MA
              ON EM.EMPLOYEID=MA.MANAGERID
              WHEN MATCHED AND EM.SALARY
              WHEN MATCHED AND EM.SALARY>MA.SALARY THEN SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT = 'EM.SALARY>MA.SALARY'
              WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY)
              ELSE IGNORE;
              MERGE INTO EMPLOYE AS EM
              USING MANAGER AS MA
              ON EM.EMPLOYEID=MA.MANAGERID
              WHEN MATCHED AND EM.SALARY
              WHEN MATCHED AND EM.SALARY>MA.SALARY THEN SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT = 'EM.SALARY>MA.SALARY'
              WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY)
              ELSE IGNORE;

              對于EM.SALARY>MA.SALARY的情況,如果你不想拋異常,而是刪除EMPLOYE中的數據,怎么辦?如下:

            以下是代碼片段:
                MERGE INTO EMPLOYE AS EM
              USING MANAGER AS MA
              ON EM.EMPLOYEID=MA.MANAGERID
              WHEN MATCHED AND EM.SALARY
              WHEN MATCHED AND EM.SALARY>MA.SALARY THEN DELETE
              WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY)
              ELSE IGNORE;
              MERGE INTO EMPLOYE AS EM
              USING MANAGER AS MA
              ON EM.EMPLOYEID=MA.MANAGERID
              WHEN MATCHED AND EM.SALARY
              WHEN MATCHED AND EM.SALARY>MA.SALARY THEN DELETE
              WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY)
              ELSE IGNORE;

              以上簡單介紹了Merge語句的使用,它的應用不只是上面介紹的情況,其實它可以應用在很多其他語句不好處理情況,這需要你去發現,記住熟能生巧



            亚洲级αV无码毛片久久精品| 亚洲国产精品久久久久网站 | 久久久久国产日韩精品网站| 国产精品久久久久久久久久免费| 亚洲&#228;v永久无码精品天堂久久| 狠狠色丁香婷婷久久综合| 国产精品久久久久久福利漫画| 久久精品国产亚洲AV不卡| 久久亚洲AV成人无码国产| 蜜桃麻豆www久久国产精品| 国产一区二区精品久久| 少妇人妻综合久久中文字幕| 2021国产成人精品久久| 久久人人爽人人爽人人AV| 亚洲第一永久AV网站久久精品男人的天堂AV | 国产精品久久久久无码av| 久久婷婷国产剧情内射白浆| 中文精品久久久久国产网址| 久久久久久人妻无码| 伊人久久综合精品无码AV专区| 香蕉aa三级久久毛片| 久久国产一片免费观看| 久久精品www| 欧美激情精品久久久久| 九九精品99久久久香蕉| 精品永久久福利一区二区| 亚洲va久久久噜噜噜久久男同 | 欧美久久久久久午夜精品| 久久国产精品免费一区二区三区| 国产成人久久AV免费| 久久A级毛片免费观看| 精品国产VA久久久久久久冰| 日韩人妻无码精品久久免费一| 99久久精品免费看国产一区二区三区| 亚洲欧美日韩精品久久亚洲区| 伊人久久大香线蕉无码麻豆| 亚洲欧美久久久久9999| 一本久道久久综合狠狠爱| 久久精品国产亚洲AV大全| 伊人久久大香线焦综合四虎| 久久久久久久综合日本|