我的表格中有四列。如果这些列的给定值在该表中不存在,我必须插入这些记录。 所以,我需要的逻辑是 -
为了实现此目的,我在 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)
此查询是否错误?
此查询是否错误?
是的,(假设您修复了缺少逗号和
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
列,它是与插入时间相对应的时间戳,因此它看起来不像什么业务逻辑应该想要进行比较 - 但是,您的问题缺乏对列含义的解释,因此如果业务逻辑确实需要它,您可能需要对该列进行比较。)