2013-07-02 68 views
1

以下更新語句是我第一次嘗試在更新語句中使用內部連接。我有語法錯誤,但我不知道在哪裏,但我不斷收到命令沒有正確結束的錯誤。有人能幫忙嗎。內部加入更新語句命令未正確結束

UPDATE m_rqgrechunk a 
SET a.persondept = b.persondept 
FROM m_rqgrechunk a 
     INNER JOIN m_person_persondept_hist b 
     ON a.person = b.person 
WHERE ((b.from_date IS NULL 
      AND b.to_date IS NULL) 
      OR (b.from_date IS NULL 
       AND a.create_date < b.to_date) 
      OR (a.create_date >= b.from_date 
       AND a.create_date < b.to_date) 
      OR (a.create_date >= b.from_date 
       AND a.to_date IS NULL)) 
     AND a.persondept IS NULL 
+0

基於「命令無法正常結束」我假設甲骨文。 –

+0

@Ryan - 這在TSQL專有的'UPDATE ... FROM'語法中是有效的。但是根據錯誤消息,他們似乎沒有使用SQL Server。 –

回答

0

與聯接是恕我直言,這樣的

UPDATE m_rqgrechunk a 
    INNER JOIN m_person_persondept_hist b 
    ON a.person = b.person 
SET a.persondept = b.persondept 
WHERE ((b.from_date IS NULL 
     AND b.to_date IS NULL) 
     OR (b.from_date IS NULL 
      AND a.create_date < b.to_date) 
     OR (a.create_date >= b.from_date 
      AND a.create_date < b.to_date) 
     OR (a.create_date >= b.from_date 
      AND a.to_date IS NULL)) 
    AND a.persondept IS NULL 
1

這是它如何能夠在Oracle中完成完成更新:

UPDATE m_rqgrechunk a 
SET a.persondept = 
     (SELECT b.persondept 
     FROM m_person_persondept_hist b 
     WHERE a.person = b.person 
      AND ((b.from_date IS NULL 
        AND b.to_date IS NULL) 
       OR (b.from_date IS NULL 
        AND a.create_date < b.to_date) 
       OR (a.create_date >= b.from_date 
        AND a.create_date < b.to_date) 
       OR (a.create_date >= b.from_date 
        AND a.to_date IS NULL)) 
     ) 
WHERE a.persondept IS NULL 
    AND EXISTS 
     (SELECT 1 
     FROM m_person_persondept_hist b 
     WHERE a.person = b.person 
      AND ((b.from_date IS NULL 
        AND b.to_date IS NULL) 
       OR (b.from_date IS NULL 
        AND a.create_date < b.to_date) 
       OR (a.create_date >= b.from_date 
        AND a.create_date < b.to_date) 
       OR (a.create_date >= b.from_date 
        AND a.to_date IS NULL)) 
     ) ; 

是不是真的需要在這種情況下,NOT EXISTS部分因爲要更新的值是NULL,所以它不會傷害(很多)無效地使用NULL更新它們,但記錄的空間會無緣無故地膨脹。


另一種方法是使用派生表:

UPDATE 
(SELECT a.persondept, b.persondept AS persondept_new 
    FROM m_rqgrechunk a 
    JOIN m_person_persondept_hist b 
     ON a.person = b.person 
    WHERE ((b.from_date IS NULL 
      AND b.to_date IS NULL) 
     OR (b.from_date IS NULL 
      AND a.create_date < b.to_date) 
     OR (a.create_date >= b.from_date 
      AND a.create_date < b.to_date) 
     OR (a.create_date >= b.from_date 
      AND a.to_date IS NULL)) 
    AND a.persondept IS NULL 
) 
SET persondept = persondept_new ; 
相關問題