2015-11-04 131 views
0

运行此更新命令时有点麻烦。我不断收到错误消息“ORA-00933:SQL命令未正确结束”。任何人都可以帮助我解决这个问题吗?这是我目前的情况?更新声明oracle - 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')) 
+1

Oracle是否支持非标准的SQL语法UPDATE FROM? – jarlh

+5

Oracle不支持UPDATE FROM。 http://stackoverflow.com/questions/7030699/oracle-sql-update-a-table-with-data-from-another-table?rq=1 http://stackoverflow.com/questions/14632621/sql-command -not-ended-error-from-update-query?lq = 1 – Thilo

回答

0

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模型的原因,您可能会从流程中的日期开始失去世纪。

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

0
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'))) 
+0

试过这个......但现在得到“ORA-01427:单行子查询返回多行” –

+0

你需要关联子查询该行正在更新;如果这是一个PK,可能在'a.cid'列。一些你正在改变的解释,为什么会很好,而不仅仅是代码转储。 –

+0

@GeorgeGeorgiou然后在子查询表2中有多个ID对应表A中的ID。请添加更多连接条件,以便子查询将仅返回每个ID的单个行。 –

相关问题