【问题标题】:Update statement oracle - ORA-00933: SQL command not properly ended更新语句 oracle - ORA-00933:SQL 命令未正确结束
【发布时间】:2016-02-04 19:08:04
【问题描述】:

运行这个更新命令有点麻烦。我不断收到错误消息“ORA-00933:SQL 命令未正确结束”。任何人都可以帮助我解决这个问题吗?这是我目前拥有的?

谢谢, 乔治

UPDATE    A
SET             EARLIEST_STARTDATE =  CASE WHEN (DATE_SUBMITTED <     TO_DATE('01/04/' || EXTRACT(YEAR FROM ADD_MONTHS(DOB, 24)),'DD/MM/YYYY'))
                                                                            THEN TO_DATE('01/04/' || EXTRACT(YEAR FROM ADD_MONTHS(DOB, 24)),'DD/MM/YYYY')
                                                                            ELSE TO_DATE(DATE_SUBMITTED,'DD/MM/YY') END 
FROM        TABLE1 A
                 INNER JOIN TABLE2 C on A.ID = C.ID                                      
WHERE     (EARLIEST_STARTDATE IS NULL) AND 
                (A.WS_ELIGIBILITY_STATUS = 1) AND 
                (A.CLAIM_ADD_CRITERIA_FLAG = 'N' OR A.CAF = 'Y' or A.CCA_CODE = 'SC' AND A.CLAIM_ADD_CRITERIA_FLAG = 'Y') AND 
                (ADD_MONTHS(C.DOB, 24) BETWEEN TO_DATE('01/01/' || EXTRACT(YEAR FROM ADD_MONTHS(C.DOB, 24)),'DD/MM/YYYY') AND TO_DATE('31/03/' || EXTRACT(YEAR FROM ADD_MONTHS(C.DOB, 24)),'DD/MM/YYYY'))

【问题讨论】:

标签: sql oracle


【解决方案1】:

Oracle 不允许您加入更新语句。您需要使用相关子查询,例如:

UPDATE TABLE1 TOP_A
SET EARLIEST_STARTDATE = (
  SELECT CASE WHEN DATE_SUBMITTED <
      TO_DATE('01/04/' || EXTRACT(YEAR FROM ADD_MONTHS(DOB, 24)), 'DD/MM/YYYY')
    THEN TO_DATE('01/04/' || EXTRACT(YEAR FROM ADD_MONTHS(DOB, 24)),'DD/MM/YYYY')
    ELSE TO_DATE(DATE_SUBMITTED,'DD/MM/YY') END
  FROM TABLE1 SUB_A
  INNER JOIN TABLE2 SUB_C on SUB_A.ID = SUB_C.ID
  WHERE SUB_A.ID = TOP_A.ID
  AND ADD_MONTHS(SUB_C.DOB, 24) BETWEEN
    TO_DATE('01/01/' || EXTRACT(YEAR FROM ADD_MONTHS(SUB_C.DOB, 24)),'DD/MM/YYYY')
      AND TO_DATE('31/03/' || EXTRACT(YEAR FROM ADD_MONTHS(SUB_C.DOB, 24)),'DD/MM/YYYY')
)
WHERE EARLIEST_STARTDATE IS NULL
AND WS_ELIGIBILITY_STATUS = 1
AND (CLAIM_ADD_CRITERIA_FLAG = 'N' OR CAF = 'Y' OR (CCA_CODE = 'SC' AND CLAIM_ADD_CRITERIA_FLAG = 'Y'))
/

这假定TABLE_1.ID 是唯一的。子查询在两个表之间进行连接,它与子查询中的WHERE SUB_A.ID = TOP_A.ID 子句正在更新的行相关。

您的 AND/OR 部分有点不清楚,因此您可能需要重新考虑这些子句周围的括号,以获得适合您业务需求的正确布尔结果。

其他情况下的TO_DATE(DATE_SUBMITTED,'DD/MM/YY') 看起来也很可疑;如果DATE_SUBMITTED 已经是一个日期,那么直接引用它,不要调用to_date()。在转换回来之前,您正在对字符串进行隐式转换;由于YY模型,您可能会从过程中的日期开始失去世纪。

其他日期处理也可以简化。

【讨论】:

    【解决方案2】:
    UPDATE    A
    SET             EARLIEST_STARTDATE =  
    (SELECT 
    CASE WHEN (DATE_SUBMITTED <     TO_DATE('01/04/' || EXTRACT(YEAR FROM ADD_MONTHS(DOB, 24)),'DD/MM/YYYY'))
                                                                                THEN TO_DATE('01/04/' || EXTRACT(YEAR FROM ADD_MONTHS(DOB, 24)),'DD/MM/YYYY')
                                                                                ELSE TO_DATE(DATE_SUBMITTED,'DD/MM/YY') END 
    FROM        TABLE1 A
                     INNER JOIN TABLE2 C on A.ID = C.ID                                      
    WHERE     (EARLIEST_STARTDATE IS NULL) AND 
                    (A.WS_ELIGIBILITY_STATUS = 1) AND 
                    (A.CLAIM_ADD_CRITERIA_FLAG = 'N' OR A.CAF = 'Y' or A.CCA_CODE = 'SC' AND A.CLAIM_ADD_CRITERIA_FLAG = 'Y') AND 
                    (ADD_MONTHS(C.DOB, 24) BETWEEN TO_DATE('01/01/' || EXTRACT(YEAR FROM ADD_MONTHS(C.DOB, 24)),'DD/MM/YYYY') AND TO_DATE('31/03/' || EXTRACT(YEAR FROM ADD_MONTHS(C.DOB, 24)),'DD/MM/YYYY')))
    

    【讨论】:

    • 试过这个...但现在得到“ORA-01427:单行子查询返回多行”
    • 您需要将子查询与正在更新的行关联起来;如果那是 PK,可能在 a.cid 列上。对您正在更改的内容以及为什么会很好的一些解释,而不仅仅是代码转储。
    • @GeorgeGeorgiou 然后在子查询 table2 中有多个 id 对应于表 A 中的 id 。请添加更多连接条件,以便子查询每个 ID 仅返回单行。
    • Oracle 不支持更新语句中的FROMJOIN
    猜你喜欢
    • 2012-05-29
    • 2014-04-15
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    相关资源
    最近更新 更多