2015-11-04 45 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的單個行。 –

相關問題