2015-01-20 4 views
1

Этот SQL отлично работает на MS SQL Server, но создает ошибку «ORA-00907: отсутствует правая скобка».Oracle vs MS SQL UPDATE с использованием IN SELECT

SQL:

UPDATE DELIVERY 
SET VISIBLE = 0 
WHERE DELIVERY.ID 
IN 
(
    SELECT DELIVERY.ID FROM delivery WHERE DELIVERY.VISIBLE = 1 
    EXCEPT 
     SELECT DELIVERY.ID FROM delivery LEFT JOIN inventory ON INVENTORY.DELIVERYID = DELIVERY.ID 
      WHERE ((DELIVERY.VISIBLE = 1) AND (INVENTORY.VISIBLE = 1)) AND (INVENTORY.INVENTORYSTATE = 3) 
); 

Есть ли способ, чтобы заставить это работать на Oracle или это обновление с использованием IN с ЗЕЬЕСТОМ только концептуально неправильным?

+0

использования Где существует в Oracle – HaveNoDisplayName

+0

@Piyush Спасибо, я посмотрю, что сейчас ... – James

+0

IN также может работать в Oracle – HaveNoDisplayName

ответ

1

В Oracle IN Можно также работать, просто изменить КРОМЕ УМЕНЬШИТЬ в Oracle http://www.techonthenet.com/sql/update.php

http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_10007.htm

http://docs.oracle.com/cd/E17952_01/refman-5.0-en/exists-and-not-exists-subqueries.html

Образец Пример для этого будет

UPDATE DELIVERY 
SET VISIBLE = 0 
WHERE DELIVERY.ID 
IN 
(
    (SELECT DELIVERY.ID FROM delivery WHERE DELIVERY.VISIBLE = 1) 
    MINUS 
    (SELECT DELIVERY.ID 
    FROM delivery LEFT JOIN inventory ON INVENTORY.DELIVERYID = DELIVERY.ID 
    WHERE (((DELIVERY.VISIBLE = 1) AND (INVENTORY.VISIBLE = 1)) 
      AND (INVENTORY.INVENTORYSTATE = 3))) 
); 
+0

Я думаю, что 'INNER JOIN' будет работать и в подзапросе, так как' NULL 'будет исключен в разделе' WHERE'. –

+0

@David Faber: - OP уже имеет тот же запрос в MSSQL, просто хочу, чтобы они не работали в Oracle – HaveNoDisplayName

+0

Да - я просто замечаю, что 'LEFT JOIN' ничего не делает здесь - не будет возвращено' NULL' из-за 'WHERE'. –

0

Я думаю, вы можете изменить этот запрос, чтобы он работал как в SQL Ser версия и Oracle:

UPDATE delivery d 
    SET d.visible = 0 
WHERE d.visible = 1 
    AND NOT EXISTS (SELECT 1 FROM inventory i 
        WHERE i.deliveryid = d.id 
         AND i.visible = 1 
         AND i.inventorystate = 3) 

Это обновит DELIVERY установка visible = 0, где visible = 1, но не соответствующая запись в INVENTORY с visible = 1 и inventorystate = 3.

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