【问题标题】:INSERT INTO SELECT if NOT EXISTS in oracle如果在 oracle 中不存在,则插入到选择中
【发布时间】:2015-07-18 13:04:23
【问题描述】:

我有以下查询。我喜欢仅当 TABLE1 中不存在该行时才插入。我该怎么做?

INSERT INTO TABLE1 (VEH_YEAR, VEH_MAKE, ACV_VOLUME)
SELECT VEH_YEAR, VEH_MAKE,
(SELECT COUNT(*)
FROM ACV_VEHICLE_DETAILS
WHERE YEAR     = table2 .veh_year
AND MAKE       = table2 .veh_make
) AS ACV_VOLUME
FROM TABLE2 table2 WHERE VEH_YEAR IS NOT NULL AND VEH_MAKE IS NOT NULL;

【问题讨论】:

  • 对表 1 进行左连接并过滤空值

标签: sql oracle not-exists


【解决方案1】:

您可以将MERGEWHEN NOT MATCHED THEN INSERT 一起使用:

merge into Table1 t
using (
   SELECT VEH_YEAR, VEH_MAKE,
   (SELECT COUNT(*)
    FROM ACV_VEHICLE_DETAILS
    WHERE YEAR     = table2 .veh_year
    AND MAKE       = table2 .veh_make
   ) AS ACV_VOLUME
   FROM TABLE2 table2 WHERE VEH_YEAR IS NOT NULL AND VEH_MAKE IS NOT NULL
) d
on (t.veh_year = d.veh_year and t.veh_make = d.veh_make)
when not matched then insert (veh_year, veh_make, acv_volume)
                      values (d.veh_year, d.veh_make, d.acv_volume);

别忘了提交 :)

【讨论】:

    【解决方案2】:

    经典LEFT JOIN:

    INSERT INTO TABLE1 (VEH_YEAR, VEH_MAKE, ACV_VOLUME)
    SELECT VEH_YEAR, VEH_MAKE, ACV_VOLUME 
    FROM(SELECT VEH_YEAR, VEH_MAKE,
                (SELECT COUNT(*)
                FROM ACV_VEHICLE_DETAILS
                WHERE YEAR = table2.veh_year
                AND MAKE = table2.veh_make) AS ACV_VOLUME
         FROM TABLE2 table2 WHERE VEH_YEAR IS NOT NULL AND VEH_MAKE IS NOT NULL
        )t
    LEFT JOIN TABLE1 t1 on t.VEH_YEAR = t1.VEH_YEAR AND t.VEH_MAKE = t1.VEH_MAKE AND t.ACV_VOLUME = t1.ACV_VOLUME
    WHERE t1.VEH_YEAR IS NULL
    

    【讨论】:

      【解决方案3】:

      你可以像这样使用NOT EXISTS

      INSERT  INTO TABLE1 ( VEH_YEAR, VEH_MAKE, ACV_VOLUME)
      SELECT  VEH_YEAR
            , VEH_MAKE
            , ( SELECT    COUNT(*)
                FROM      ACV_VEHICLE_DETAILS
                WHERE     YEAR = t2.veh_year
                      AND MAKE = t2.veh_make
               ) AS ACV_VOLUME
      FROM    TABLE2 t2
      WHERE   VEH_YEAR IS NOT NULL
          AND VEH_MAKE IS NOT NULL
          AND NOT EXISTS (SELECT 1
                          FROM  Table1 t1 
                          WHERE t1.VEH_YEAR = t2.VEH_YEAR
                            AND t1.VEH_MAKE = t2.VEH_MAKE
                            );
      

      这假设您仅在 VEH_MAKEVEH_YEAR 都已存在时才想排除,如果您想从 INSERT 中排除仅基于 VEH_MAKE 的所有记录,您只需更改相关的 WHERE 标准, 不包括t1.VEH_YEAR = t2.VEH_YEAR

      【讨论】:

        【解决方案4】:

        使用not exists:

        INSERT INTO TABLE1 (VEH_YEAR, VEH_MAKE, ACV_VOLUME)
            SELECT VEH_YEAR, VEH_MAKE, 
                   (SELECT COUNT(*)
                    FROM ACV_VEHICLE_DETAILS vd
                    WHERE vd.YEAR = t2.veh_year AND vd.MAKE = t2.veh_make
                   ) AS ACV_VOLUME
            FROM TABLE2 t2 
            WHERE VEH_YEAR IS NOT NULL AND VEH_MAKE IS NOT NULL AND
                  NOT EXISTS (SELECT 1
                              FROM table1 t1
                              WHERE t1.veh_year = t2.veh_year and t1.veh_make = t2.veh_make
                             );
        

        【讨论】:

        • 在我的选择查询中仍然看到多行“1981 CHEVROLET 0”
        • 这些行可能不是完全重复的。 veh_make 很可能包含额外的字符。
        猜你喜欢
        • 2020-02-04
        • 2010-12-14
        • 1970-01-01
        • 2012-06-01
        • 2012-03-14
        • 2022-10-13
        • 1970-01-01
        • 2021-10-22
        • 1970-01-01
        相关资源
        最近更新 更多