【问题标题】:Insert only when values does not exist in oracle sql仅在 oracle sql 中不存在值时插入
【发布时间】:2018-06-26 12:36:38
【问题描述】:

我有以下查询,我正在使用 oracle 存储过程。查询运行良好,但我想在此查询中添加条件,以便如果行值与 name,e_id,c_date,p_check 的组合已经存在,则不要插入此值。

INSERT INTO M_LOG(NAME, E_ID, C_DATE, STATUS, P_CHECK)
Select MAX(ML.NAME), ML.E_ID, C_DATE, 1, 'M Step_1' from F_LOG ML,DIR_LOG MD
WHERE ML.NAME != MD.NAME and ML.E_ID != MD.E_ID and MD.C_DATE = LAST_DAY(to_date(sysdate,'YYYYMMDD'))
GROUP BY ML.E_ID,C_DATE;

【问题讨论】:

  • 使用合并语句
  • 同意merge 更灵活,但您也可以考虑在现有的insert 中添加not exists (select ...)

标签: sql oracle stored-procedures duplicates sql-insert


【解决方案1】:

您可以将MERGEWHEN NOT MATCHED 子句一起使用:

MERGE INTO M_LOG dst
USING (
  Select MAX(ML.NAME) AS name,
         ML.E_ID,
         C_DATE,
         1 AS status,
         'M Step_1 As p_check'
  from   F_LOG ML
         INNER JOIN DIR_LOG MD
         ON (   ML.NAME != MD.NAME
            AND ML.E_ID != MD.E_ID )
  WHERE  MD.C_DATE = LAST_DAY( TRUNC( sysdate ) )
  GROUP BY ML.E_ID,C_DATE
) src
ON (   src.name    = dst.name
   AND src.e_id    = dst.e_id
   AND src.c_date  = dst.c_date
   AND src.p_check = dst.p_check )
WHEN NOT MATCHED THEN
  INSERT (NAME, E_ID, C_DATE, STATUS, P_CHECK)
  VALUES ( src.name, src.e_id, src.c_date, src.status, src.p_check );

【讨论】:

  • 我一定会试试这个
【解决方案2】:

你可以使用NOT EXISTS

 INSERT INTO m_log
            (
                name,
                e_id,
                c_date,
                status,
                p_check
            )
SELECT MAX(ml.name) name,
       ml.e_id,
       c_date,
       1          status,
       'M Step_1' p_check
FROM   f_log ml
WHERE  NOT EXISTS
       (
                SELECT   1
                FROM     dir_log md
                WHERE    ( ml.name = md.name
                               OR  ml.e_id = md.e_id )
                AND      md.c_date = LAST_DAY(TRUNC(SYSDATE)) )
                GROUP BY ml.e_id,
                         c_date; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 2012-09-23
    • 2016-05-07
    • 2018-01-17
    • 1970-01-01
    相关资源
    最近更新 更多