• <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++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            DB2 Merge語句

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

              DB2 Merge語句的作用非常強大,它可以將一個表中的數(shù)據(jù)合并到另一個表中,在合并的同時可以進行插入、刪除、更新等操作。我們還是先來看個簡單的例子吧,假設(shè)你定義了一個雇員表(employe),一個經(jīng)理表(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);

              --經(jīng)理表(MANAGER)

            以下是代碼片段:
                CREATE TABLE MANAGER (
              EMPLOYEID INTEGER NOT NULL,---經(jīng)理號
              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);

              --經(jīng)理表(MANAGER)

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

             經(jīng)過一段時間,你發(fā)現(xiàn)這樣的數(shù)據(jù)模型,或者說表結(jié)構(gòu)設(shè)計簡直就是一大敗筆,經(jīng)理和雇員都是員工嘛,為什么要設(shè)計兩個表呢?發(fā)現(xiàn)錯誤后就需要改正,所以你決定,刪除經(jīng)理表(MANAGER)表,將MANAGER 表中的數(shù)據(jù)合并到EMPLOYE 表中,仔細分析發(fā)現(xiàn),王五在兩個表中都存在(可能是干的好升官了),而劉八在EMPLOYE 表中并不存在,現(xiàn)在,我們要求把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);

             


             在上面的處理中,我們用經(jīng)理表(MANAGER)的薪水更新了雇員表(EMPLOYE)的薪水,假設(shè)現(xiàn)在要求,如果經(jīng)理表(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);

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

            以下是代碼片段:
                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中的數(shù)據(jù),怎么辦?如下:

            以下是代碼片段:
                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語句的使用,它的應(yīng)用不只是上面介紹的情況,其實它可以應(yīng)用在很多其他語句不好處理情況,這需要你去發(fā)現(xiàn),記住熟能生巧



            久久精品欧美日韩精品| 国产成人久久久精品二区三区| 无码精品久久一区二区三区| 精品久久国产一区二区三区香蕉| 开心久久婷婷综合中文字幕| 无码国内精品久久人妻麻豆按摩| 欧美精品国产综合久久| 国产精品久久久久久久久免费| 久久se这里只有精品| 中文字幕无码av激情不卡久久| 亚洲AV无码1区2区久久| 精品久久人人做人人爽综合| 久久久久亚洲AV片无码下载蜜桃| 久久精品国产99国产精偷| 久久久久九国产精品| 成人综合伊人五月婷久久| 女人高潮久久久叫人喷水| 久久播电影网| 久久精品国产99国产电影网| 久久久久人妻一区二区三区| 国产成人久久精品二区三区| av午夜福利一片免费看久久| 久久精品人人做人人爽电影| 久久久久婷婷| 91麻精品国产91久久久久| 99久久国语露脸精品国产| 亚洲伊人久久精品影院| 久久人人添人人爽添人人片牛牛| 激情综合色综合久久综合| 中文精品久久久久国产网址| 国产精品久久久久久一区二区三区| 人妻无码αv中文字幕久久琪琪布 人妻无码精品久久亚瑟影视 | 伊人久久大香线蕉AV色婷婷色| 精品久久久久久无码人妻热 | 无码精品久久久天天影视| 欧美久久亚洲精品| 精品多毛少妇人妻AV免费久久| 久久久精品免费国产四虎| 2021久久国自产拍精品| 久久人人爽爽爽人久久久| 色综合久久中文字幕无码|