2017-02-15 4 views
1

次の問合せからexists文を削除すると、出力はどのように変化しますか?


存在するものと存在しないものがあるoracle

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

ザ・現在、更新がAR_CRDTレコードがAR1_CUSTOMER_CREDITレコードに関連付けられているそれらのレコードに限定されるものではAR_CRDTになりEXISTS。

この句を削除すると、AR_CRDTのすべてのレコードが更新されます。サブクエリの値を持つものもあれば、AR_CRDTとAR1_CUSTOMER_CREDITの間にリンクがない場合はNULLになるものもあります。

関連する問題