【问题标题】:Not properly end sql query [duplicate]未正确结束 sql 查询 [重复]
【发布时间】:2018-09-16 01:13:52
【问题描述】:

为什么这个更新抛出错误没有正确结束?

UPDATE FACT_MGP_MASDP1
SET STATUS_DN = 'AGING_REPORTED', ASSET_DN_KEY = '7258-1046', STATUS = 'AGING_REPORTED'
FROM FACT_MGP_MASDP1 T1
INNER JOIN FACT_MGP_ASSET T2
    ON (T2.ASSET_ID = T1.ASSET_ID)
WHERE T1.DATEKEY = 20171231 OR T1.DATEKEY = 20171130;

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    Oracle 不支持使用 join 进行更新,但我们可以使用 Inline View 重写如下查询:

    UPDATE 
    (
     SELECT STATUS_DN  AS OldVal,
            ASSET_DN_KEY AS OldVal1,
            STATUS AS OldVal2
     FROM FACT_MGP_MASDP1 T1
     INNER JOIN FACT_MGP_ASSET T2
     ON (T2.ASSET_ID = T1.ASSET_ID)
     WHERE T1.DATEKEY = 20171231 OR T1.DATEKEY = 20171130
     ) AS t
    SET t.OldVal = 'AGING_REPORTED', t.OldVal1= '7258-1046' , t.OldVal2= 'AGING_REPORTED' ;
    

    以下是一般语法:

    【讨论】:

      【解决方案2】:

      在内部选择查询中使用更新:

      UPDATE 
      ( SELECT STATUS_DN, ASSET_DN_KEY, STATUS  FROM FACT_MGP_MASDP1 T1
       INNER JOIN FACT_MGP_ASSET T2 ON (T2.ASSET_ID = T1.ASSET_ID)
       WHERE T1.DATEKEY = 20171231 OR T1.DATEKEY = 20171130
       ) AS A
      SET A.STATUS_DN = 'AGING_REPORTED', A.ASSET_DN_KEY= '7258-1046' , A.STATUS= 'AGING_REPORTED' ;
      

      【讨论】:

        【解决方案3】:

        Oracle 不支持更新连接语法,但我们可以改写为:

        UPDATE FACT_MGP_MASDP1
        SET
            STATUS_DN = 'AGING_REPORTED',
            ASSET_DN_KEY = '7258-1046',
            STATUS = 'AGING_REPORTED'
        FROM FACT_MGP_MASDP1 T1
        WHERE
            EXISTS (SELECT 1 FROM FACT_MGP_ASSET WHERE T2.ASSET_ID = T1.ASSET_ID) AND
            T1.DATEKEY IN (20171231, 20171130)
        

        这在逻辑上应该与您在问题中写的内容等效的原因是,您的内部联接仅从目标表中过滤掉与 FACT_MGP_ASSET 表中的任何内容都不匹配的记录。

        【讨论】:

          猜你喜欢
          • 2020-02-25
          • 2013-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-27
          相关资源
          最近更新 更多