合并语句不插入记录

问题描述 投票:0回答:1

我的表格中有四列。如果这些列的给定值在该表中不存在,我必须插入这些记录。 所以,我需要的逻辑是 -

  • 如果该表中存在所有值,则不执行任何操作,
  • 如果任何一个值不存在,则插入。

为了实现此目的,我在 ORACLE 中使用 Merge 语句,但它始终显示合并了 0 行。

  MERGE INTO AVAILABLE_VALUES V1
  USING 
      (SELECT YEAR1, MONTH1, DATE1, VAL FROM AVAILABLE_VALUES
       WHERE YEAR1 = 2026 AND MONTH1 = 11 AND DATE1 = <<SOME DATE>> AND VAL = 1000  
       ) V2 
  ON (
          V1.YEAR1 = V2.YEAR1 AND
          V1.MONTH1 = V2.MONTH1 AND
          V1.DATE1 = V2.DATE1
          V1.VAL = V2.VAL 
      )                                       
  WHEN NOT MATCHED THEN
  INSERT (V1.YEAR1 ,V1.MONTH1 , V1.DATE1, V1.VAL )
  VALUES (2026, 11, current_date 1200)

此查询是否错误?

oracle merge
1个回答
0
投票

此查询是否错误?

是的,(假设您修复了缺少逗号和

AND
导致的语法错误),那么它在逻辑上似乎也是不正确的。您从
AVAILABLE_VALUES
中选择值,然后将它们与
AVAILABLE_VALUES
中的值进行比较,看看它们是否不存在,如果不存在,则
INSERT
处理它们,但它们不会存在而无法插入它们。如果您想插入新值,请不要从您尝试插入的表中
SELECT
来尝试查找新值,因为它们将不存在。
使用类似:

INSERT

(注意:根据您最终的 

MERGE INTO AVAILABLE_VALUES dst USING ( SELECT 2026 AS year, 11 AS month, 1000 AS value FROM DUAL ) src ON ( src.year = dst.year1 AND src.month = dst.month1 AND src.value = dst.val ) WHEN NOT MATCHED THEN INSERT (dst.YEAR1, dst.MONTH1, dst.DATE1, dst.VAL) VALUES (src.year, src.month, CURRENT_DATE, src.value); 语句,我从比较中省略了

DATE1
列,它是与插入时间相对应的时间戳,因此它看起来不像什么业务逻辑应该想要进行比较 - 但是,您的问题缺乏对列含义的解释,因此如果业务逻辑确实需要它,您可能需要对该列进行比较。)

    

© www.soinside.com 2019 - 2024. All rights reserved.