ОБНОВЛЕНИЕ SQL с несколькими условиями WHERE (отношения) - PullRequest
3 голосов
/ 27 апреля 2019

Я хотел бы знать, возможно ли выполнить такое ОБНОВЛЕНИЕ в базе данных Oracle Oracle:

UPDATE mark
        SET
        mark=
        CASE
        WHEN mark.val<= 5 
            THEN val*1.1
        ELSE val END
        WHERE mark.id_classes = classes.id_classes 
            AND classes.ID_subject = subject.ID_subject
            AND subject.ID_subject = 5;

Разработчик SQL возвращает ошибку в этой части:

WHERE mark.id_classes = classes.id_classes 
            AND classes.ID_subject = subject.ID_subject
            AND subject.ID_subject = 5;

Итак, я полагаю, что невозможно создать такое сложное условие, есть ли другой способ сделать это тогда?

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

Ответы [ 3 ]

1 голос
/ 27 апреля 2019

Вы можете использовать подзапрос:

UPDATE mark
    SET mark = val * 1.1
    WHERE mark.val <= 5 AND
          EXISTS (SELECT 1
                  FROM classes c JOIN
                       subjects s
                       ON c.ID_subject = s.ID_subject
                  WHERE mark.id_classes = c.id_classes AND                       
                        s.ID_subject = 5
                 );

Обратите внимание, что я переместил условие CASE в предложение WHERE, поэтому обновляются только те строки, которые необходимо обновить.

1 голос
/ 27 апреля 2019

Я считаю, что в подобных случаях оператор MERGE легче понять:

MERGE INTO MARK m
  USING (SELECT c.ID_CLASSES
           FROM CLASSES c
           WHERE c.ID_SUBJECT = 5) d
    ON (m.ID_CLASSES = d.ID_CLASSES)
  WHEN MATCHED THEN
    UPDATE SET m.MARK = CASE
                          WHEN m.VAL <= 5 
                            THEN m.VAL * 1.1
                          ELSE
                             m.VAL
                        END

Или, поскольку ID_SUBJECT является константой, вы можете упростить обновление до

UPDATE MARK m
  SET m.MARK = CASE
                 WHEN m.VAL <= 5 
                   THEN m.VAL * 1.1
                 ELSE
                   m.VAL
                 END
  WHERE m.ID_CLASSES = 5
* 1006.* Удачи.
1 голос
/ 27 апреля 2019

Вы не можете ссылаться на другие две таблицы (CLASSES и SUBJECT) просто так , из ниоткуда.Вот код, который показывает , как вы могли бы это сделать:

update mark m set
  m.mark = (select case when m.val <= 5 then m.val * 1.1
                        else m.val
                   end
            from classes c join subject s on c.id_subject = s.id_subject
            where c.id_classes = m.id_classes
              and s.id_subject = 5
           )
where ... 

Поскольку вы не использовали псевдонимы таблиц в CASE, я не знаю, к какой таблице принадлежит столбец VALto (так что я предположил, что это MARK).

Кроме того, UPDATE сам по себе может потребоваться условие WHERE, которое ограничит количество обновляемых строк.

...