WITH,合并子查询

WITH, MERGE SUBQUERY

我希望通过子查询执行合并,所有这一切都是为了让特定的 RFC 字段是唯一的,无论其他列是否有其他字段,并且它可以根据情况更新和插入,但在合并它标记了以下错误。

“缺少 SELECT 关键字”

WITH S AS
(
SELECT
        T1.id_conce,T1.name_cont,T1.rfc
    FROM 
    (
    SELECT T1.*, ROW_NUMBER() OVER (PARTITION BY T1.rfc ORDER BY T1.rfc  DESC) ENUM 
    FROM B69_TBL_ALERT_CONCE T1
    )T1
    WHERE ENUM=1 
AND RFC IS NOT NULL
)
 MERGE  B69_TBL_ALERT alert
    USING 
    S ON alert.rfc = s.rfc AND
    WHERE ENUM=1 
AND RFC IS NOT NULL
WHEN MATCHED THEN
UPDATE SET
alert.id_conce = T1.id_conce,
alert.name_cont = T1.name_cont
WHEN NOT MATCHED THEN
INSERT (alert.id_alert,alert.id_alerttipo,alert.id_conce,alert.rfc,
        alert.name_cont,alert.baja_logica,alert.last_update)
VALUES (id_alertaaut.nextval,'1',s.id_conce,s.rfc,
        s.name_cont,'0','11/05/2021')

您的子查询必须在 USING() 子句中:

 MERGE  B69_TBL_ALERT alert
    USING 
(SELECT
        T1.id_conce,T1.name_cont,T1.rfc
    FROM 
    (
    SELECT T1.*, ROW_NUMBER() OVER (PARTITION BY T1.rfc ORDER BY T1.rfc  DESC) ENUM 
    FROM B69_TBL_ALERT_CONCE T1
    )T1
    WHERE ENUM=1 
AND RFC IS NOT NULL
)
    S ON alert.rfc = s.rfc AND
    WHERE ENUM=1 
AND RFC IS NOT NULL
WHEN MATCHED THEN
UPDATE SET
alert.id_conce = T1.id_conce,
alert.name_cont = T1.name_cont
WHEN NOT MATCHED THEN
INSERT (alert.id_alert,alert.id_alerttipo,alert.id_conce,alert.rfc,
        alert.name_cont,alert.baja_logica,alert.last_update)
VALUES (id_alertaaut.nextval,'1',s.id_conce,s.rfc,
        s.name_cont,'0','11/05/2021')

你想要:

MERGE  B69_TBL_ALERT alert
USING (
  SELECT id_conce,            -- Don't use WITH clause, put the query in the USING clause
         name_cont,
         rfc
  FROM   (
    SELECT T1.*,
           ROW_NUMBER() OVER (PARTITION BY T1.rfc ORDER BY T1.rfc  DESC) ENUM 
    FROM   B69_TBL_ALERT_CONCE T1
  )
  WHERE  ENUM=1 
  AND    RFC IS NOT NULL
) s
ON (
      alert.rfc  = s.rfc
  AND alert.ENUM = 1         -- Use the appropriate alias for the column
  AND alert.RFC IS NOT NULL  -- Use the appropriate alias for the column
)
WHEN MATCHED THEN
  UPDATE SET
    id_conce  = s.id_conce,     -- Alias should be S not T1
    name_cont = s.name_cont     -- Alias should be S not T1
WHEN NOT MATCHED THEN
  INSERT (
    id_alert,
    id_alerttipo,
    id_conce,
    rfc,
    name_cont,
    baja_logica,
    last_update
  ) VALUES (
    id_alertaaut.nextval,
    '1',
    s.id_conce,
    s.rfc,
    s.name_cont,
    '0',
    DATE '2021-05-11'           -- Use a DATE literal rather than a string
  )