未正确结束 sql 查询 [重复]

Posted

技术标签:

【中文标题】未正确结束 sql 查询 [重复]【英文标题】:Not properly end sql query [duplicate] 【发布时间】: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;

【问题讨论】:

【参考方案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 表中的任何内容都不匹配的记录。

【讨论】:

以上是关于未正确结束 sql 查询 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

试图在我的 SQL 表中插入多行。总是显示 SQL 命令未正确结束 [重复]

sql查询问题,想找出开始时间和结束时间

SQL 命令未在更新语句中正确结束 [重复]

使用子查询时“SQL 命令未正确结束”

如果存在则删除表 Oracle,SQL Developer [重复]

SQL 命令未正确结束尝试使用查询连接 3 个表