SQL (и Javax.Persistence.Query.ExecuteQuery) Как использовать UPDATE с WHERE-IN и AND

Я пытаюсь сделать оператор SQL, который обновляет определенные строки в столбце «статус» таблицы с «НЕ ОК» на «ОК», но только для строк с предоставленным идентификатором и статусом.

Данные в таблице (table1.id, table1.status) = [ID1, ОЖИДАНИЕ], [ID2, НЕ ОК], [ID3, НЕ ОК]

Список идентификаторов будет передан из java в часть «in ()», у меня есть только идентификатор и нет данных о состоянии. Обратите внимание, что статус ID1 отличается от «НЕ ОК».

Код, который у меня есть до сих пор;

UPDATE table1
SET table1.status = 'OK'
WHERE table1.status = 'NOT OK' AND table1.id in ('ID1', 'ID2', 'ID3')

Если список внутри скобок содержит все идентификаторы с пометкой «НЕ ОК», изменения будут внесены во все идентификаторы в скобках. Но если один из идентификаторов содержит другой статус, он не внесет никаких изменений.

Оператор должен игнорировать ID1, потому что его статус не «НЕ ОК», но все же изменить статус на OK для ID2 и ID3. Как можно исправить код? Примечание. Мне не разрешено использовать Создать таблицу (даже временную) из-за ограничений привилегий.

Я мог сделать два вызова SQL; сначала выбрать по идентификатору, где статус = не в порядке, затем, во-вторых, сделать этот оператор обновления без части «ГДЕ table1.status = 'не в порядке'», но я пытаюсь избежать этого, если это возможно


person Kuei    schedule 27.05.2020    source источник
comment
Этот код должен делать то, что вы описываете. Вы также должны пометить базу данных, которую вы используете.   -  person Gordon Linoff    schedule 27.05.2020
comment
@GordonLinoff Спасибо за ответ, Гордон, пока он вносит изменения во все идентификаторы в () или ничего. Я пытаюсь разрешить ему вносить изменения в некоторые идентификаторы в ()   -  person Kuei    schedule 27.05.2020
comment
Если id 1 имел статус NOT OK до выполнения запроса, как узнать, повлиял ли на него запрос?   -  person GMB    schedule 27.05.2020


Ответы (1)


Это немного долго для комментария.

Ваш код делает именно то, что вы хотите: обновляет строки, которые удовлетворяют условиям как для status, так и для ids. Вот скрипт db‹>, иллюстрирующий это. Эта скрипка использует Postgres, но это не имеет значения. Код будет работать одинаково в любой базе данных.

Я подозреваю, что у вас ошибка в передаче ids, статусы просто путаница. Вы не предоставили достаточно информации, чтобы определить, в чем заключается ошибка. Но ваш код SQL делает то, что вы хотите.

person Gordon Linoff    schedule 27.05.2020