2015-03-01 7 views
0
UPDATE QITEM 
    SET QTYONHAND = QTYONHAND + (SELECT SUM(DELQTY) 
            FROM QDEL 
           WHERE QITEM.ITEMNAME = QDEL.ITEMNAME); 

Я пытаюсь обновить столбец инвентаризации, где intial значения являются 1000 и я добавляю количество поставок из таблицы QDEL к этому 1000. Это работает, но есть нуль значения, присутствующие в строках без поставок в таблице QDEL. Я не могу понять, почему ???ORACLE SQL Developer Update Заявление

ответ

2

Потому что SUM возвращает NULL, если все DELQTY строк: NULL. Вы можете сделать что-то вроде этого:

UPDATE QITEM 
SET QTYONHAND = QTYONHAND + COALESCE((SELECT SUM(DELQTY) 
FROM QDEL 
WHERE QITEM.ITEMNAME = QDEL.ITEMNAME), 0); 
1

Используйте NVL, чтобы всегда возвращать сумму, даже если поставки не были выполнены.

UPDATE QITEM 
SET QTYONHAND = QTYONHAND + (SELECT NVL(SUM(DELQTY),0) 
    FROM QDEL 
    WHERE QITEM.ITEMNAME = QDEL.ITEMNAME); 
2

Вам нужно добавить WHERE EXISTS так что вы только обновление строки, в которых есть хотя бы одна соответствующая запись в QDEL:

UPDATE qitem qi 
    SET qi.qtyonhand = qi.qtyonhand + (SELECT SUM(qd.delqty) 
             FROM qdel qd 
             WHERE qd.itemname = qi.itemname) 
WHERE EXISTS (SELECT 1 FROM qdel qd 
       WHERE qd.itemname = qi.itemname); 

P.S. Если значение delqty в QDEL должно быть NULL, вы должны использовать SUM(NVL(qd.delqty, 0)) (или SUM(COALESCE(qd.delqty, 0))), а не SUM(qd.delqty).

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