与 ROW_NUMBER 合并

问题描述

我正在尝试执行合并以插入和更新,视情况可能在表中。但是在表1中,我只希望它插入tbl2.rfc字段的唯一值,而不管我的其他字段是否发生变化,我只想显示该字段的唯一值。我正在占用 ROW_NUMBER 函数以仅带来唯一值,但我无法将此函数添加到我的合并中。

MERGE INTO   B69_TBL1 tbl1
    USING  (SELECT T1.*,ROW_NUMBER() OVER (PARTITION BY T1.rfc ORDER BY T1.rfc  DESC) ENUMERADO                 
    FROM B69_TBL2 tbl2 
    
WHEN MATCHED THEN
UPDATE SET
tbl1.id_tbl1 = tbl2.id_con,tbl1.rfc = tbl2.rfc,tbl1.rfc = tbl2.name_cont

WHEN NOT MATCHED THEN
INSERT (tbl1.id_tbl1,tbl1.tbl1tipo,tbl1.id_concenTrado,tbl1.rfc,tbl1.name_cont,tbl1.baja_logica,tbl1.last_update)
VALUES (id_tbl1autt.nextval,'1',tbl2.id_concenTrado,tbl2.rfc,tbl2.name_cont,'0','11/05/2021')
        ) T1
WHERE ENUMERADO=1 
AND RFC IS NOT NULL

标记错误是 00907. 00000 - “缺少右括号”

因为我有这样的经历,但它完全失败了。

MERGE INTO   B69_TBL1 tbl1
    USING  (SELECT T1.*,ROW_NUMBER() OVER (PARTITION BY T1.rfc ORDER BY T1.rfc  DESC) ENUMERADO    
    ON   tbl1.rfc = tbl2.rfc
    FROM B69_TBL2 tbl2 )
    
WHEN MATCHED THEN
UPDATE SET
tbl1.id_alert = tbl2.id_con,tbl1.rfc = tbl2.name_cont

WHEN NOT MATCHED THEN
INSERT (tbl1.id_alert,tbl1.alertype,tbl1.id_con,tbl2.id_con,'11/05/2021')
        ) T1
WHERE ENUMERADO=1 
AND RFC IS NOT NULL

解决方法

  • 您的 ON 子句位置错误;
  • 您在 tbl2 查询中使用了 USING 别名,而不是跟随它;
  • tbl1UPDATE 中的目标列名称之前不需要 INSERT 别名;
  • 您更新了 rfc 列两次(我删除了第二个实例);
  • 插入后有一个奇怪的 T1 别名,应该在 USING 查询中;和
  • 您可以使用 DATE 文字而不是字符串。

可能还有其他错误,因为我没有您的表来测试查询。

MERGE INTO   B69_TBL1 tbl1
USING  (
  SELECT T1.*,ROW_NUMBER() OVER (PARTITION BY T1.rfc ORDER BY T1.rfc  DESC) AS ENUMERADO
  FROM   B69_TBL2 t1
)  tbl2
ON tbl1.rfc = tbl2.rfc
WHEN MATCHED THEN
  UPDATE SET
    id_alert = tbl2.id_con,rfc = tbl2.rfc
WHEN NOT MATCHED THEN
  INSERT (
    id_alert,alertype,id_con,rfc,name_cont,baja_logica,last_update
  ) VALUES (
    id_tbl1autt.nextval,'1',tbl2.id_con,tbl2.rfc,tbl2.name_cont,'0',DATE '2021-05-11'
  )
  WHERE ENUMERADO=1 
  AND   RFC IS NOT NULL