【问题标题】:Getting error "ORA-00933: SQL command not properly ended" [duplicate]出现错误“ORA-00933:SQL 命令未正确结束”[重复]
【发布时间】:2019-08-22 08:44:27
【问题描述】:

我能够在 select 语句上获得结果,但在使用 update 时我遇到了问题。 数据库服务器:- Oracle 11g。

update  t1
set t1.componentID = cteData.componentID
from tpinventryrecds t1
inner join ( select * from
(select TPLVLKEY , standardName , DOCTYPE , 'Default' as componentID ,count(*) as val from tpinventryrecds
where  componentID is  null
group by TPLVLKEY , standardName , DOCTYPE)`enter code here`
where val = 1) cteData
on t1.TPLVLKEY =  cteData.TPLVLKEY
and t1.standardName = cteData.standardName
and t1.DOCTYPE = cteData.DOCTYPE;

【问题讨论】:

    标签: sql oracle join sql-update


    【解决方案1】:

    你不能SET ... FROM - 它可能必须是一个子查询,例如这个例子;我并不是说它是正确的,但是 - 至少 - 它应该可以编译。

    UPDATE t1
       SET t1.componentID =
              (SELECT cteData.componentID
                 FROM tpinventryrecds t1
                      INNER JOIN
                      (SELECT *
                         FROM (  SELECT TPLVLKEY,
                                        standardName,
                                        DOCTYPE,
                                        'Default' AS componentID,
                                        COUNT (*) AS val
                                   FROM tpinventryrecds
                                  WHERE componentID IS NULL
                               GROUP BY TPLVLKEY, standardName, DOCTYPE)
                        WHERE val = 1) cteData
                         ON     t1.TPLVLKEY = cteData.TPLVLKEY
                            AND t1.standardName = cteData.standardName
                            AND t1.DOCTYPE = cteData.DOCTYPE);
    

    【讨论】:

    • 说明单行子查询返回多于一行 01427. 00000 - “单行子查询返回多于一行”
    • 嗯,这就是你应该解决的问题,方法是确保这样的 SELECT 只返回一行,或者通过在 WHERE 子句中应用附加条件,或者 - 如果可能 - 选择 DISTINCT componentID。
    【解决方案2】:

    使用合并

    MERGE INTO tpinventryrecds t
    USING 
    (
      select TPLVLKEY , standardName , DOCTYPE , 'Default' as componentID ,count(*) as val from tpinventryrecds
    where  componentID is  null
    group by TPLVLKEY , standardName , DOCTYPE
    ) cteData ON ( t1.TPLVLKEY =  cteData.TPLVLKEY
    and t1.standardName = cteData.standardName
    and t1.DOCTYPE = cteData.DOCTYPE)
    WHEN MATCHED THEN UPDATE 
        SET t1.componentID = cteData.componentID
    

    【讨论】:

    • 谢谢它有效..!
    • 想知道为什么它不工作相同的语句在 SQL 服务器上工作但在 oracle 上不工作
    • @ShubhamJain 如果它可以工作,则标记为已接受并且 sql server 和 oracle 是两个不同的 dbms,因此语句是可变的
    猜你喜欢
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多