2017-02-15 2 views
1

Каким образом мой выход изменится, если я удалю существующий оператор из следующего запроса.


Есть ли существует vs, не существует в 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

Это аналогично различию между внутренним соединением и левым внешним соединением. Фактически это ** - это разница между внутренним и внешним соединением, если вы переписываете свое обновление для обновления соединения, как описано здесь: http://stackoverflow.com/documentation/oracle/8061/update- с-joins # t = 201702151427027709587 – mathguy

ответ

2

Если вы удалите exists, затем OPERATOR_ID и UPDT_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 быть ограничено теми записями, где запись AR_CRDT связано с записью AR1_CUSTOMER_CREDIT.

Удаление этого предложения означает, что ВСЕ записи AR_CRDT будут обновлены. Некоторые из них будут иметь значения для подзапроса, а некоторые будут NULL, где нет связи между AR_CRDT и AR1_CUSTOMER_CREDIT.

Смежные вопросы