2017-02-15 88 views
1

如果我從以下查詢中刪除exists語句,輸出如何更改?


在oracle中存在vs不存在

UPDATE AR_CRDT C 
set (OPERATOR_ID,UPDT_TS) = (SELECT AD.OPERATOR_ID,sysdate 
       FROM 
       (
        Select A.* 
        FROM AR1_CUSTOMER_CREDIT A  
       )AD 
       WHERE AD.CREDIT_ID = C.CRDT_ID 

       ) 
where exists (SELECT 1 
       FROM 
       (
        Select A.* 
        FROM AR1_CUSTOMER_CREDIT A   
       )AD 
        WHERE AD.CREDIT_ID = C.CRDT_ID 
       ); 
+0

這類似於內連接和左外連接之間的區別。它實際上**是**內部連接和外部連接之間的區別,如果您將'update'重寫爲連接的更新,如下所述:http://stackoverflow.com/documentation/oracle/8061/update- with-joins#t = 201702151427027709587 – mathguy

回答

2

如果刪除exists,然後OPERATOR_IDUPDT_TS將被設置爲NULL爲行,其中的條件不匹配。

你爲什麼要用額外的子查詢來寫這個?

UPDATE AR_CRDT C 
    SET (OPERATOR_ID, UPDT_TS) = (SELECT AD.OPERATOR_ID, sysdate 
            FROM AR1_CUSTOMER_CREDIT A  
            WHERE A.CREDIT_ID = C.CRDT_ID 
           ) 
    WHERE EXISTS (SELECT 1 
        FROM AR1_CUSTOMER_CREDIT A   
        WHERE A.CREDIT_ID = C.CRDT_ID 
       ); 
+0

額外的子查詢可以在那裏從上面複製粘貼確切的子查詢。 –

+0

謝謝戈登。我刪除了不需要的子查詢。 – mac07

2

目前EXISTS使更新AR_CRDT侷限於在AR_CRDT記錄與AR1_CUSTOMER_CREDIT記錄相關聯的記錄。

刪除該子句將意味着將更新AR_CRDT的所有記錄。其中一些將具有子查詢的值,其中一些將在AR_CRDT和AR1_CUSTOMER_CREDIT之間沒有鏈接的情況下爲NULL。