2017-02-15 84 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。