sqlite3 ОБНОВЛЕНИЕ, генерирующее нули - PullRequest
1 голос
/ 27 марта 2012

Я пытаюсь перейти с MySQL на SQLIte3 и столкнулся с проблемой обновления. Я использую SQLite 3.6.20 на Redhat.

Моя первая строка кода ведет себя нормально

 update atv_covar set noncomp= 2;

Все значения для некомпиляции (в крайнем правом столбце) соответственно установлены на 2.

select * from atv_covar;
A5202|S182|2
A5202|S183|2
A5202|S184|2

Это вторая строка кода, которая доставляет мне проблемы:

 update atv_covar 
 set noncomp= (select 1 from f4003 where
               atv_covar.study = f4003.study and 
               atv_covar.rpid = f4003.rpid and 
               (rsoffrx="81" or rsoffrx="77"));

Он работает без генерации ошибок и соответствующим образом устанавливает atv_covar.noncomp равным 1, где он соответствует оператору SELECT. Проблема состоит в том, что он изменяет atv_covar.noncomp для несоответствующих строк на ноль, где я хочу, чтобы они оставляли их равными 2.

select * from atv_covar;
A5202|S182|
A5202|S183|1
A5202|S184|

Любая помощь будет приветствоваться.

1 Ответ

0 голосов
/ 24 апреля 2012

@ Дэн, проблема с вашим запросом не относится к SQLite; Вы обновляете все строки atv_covar, но не все из них имеют соответствие в f4003, поэтому по умолчанию они равны NULL. Вам следует отфильтровать обновление или указать значение по умолчанию.

Следующий оператор устанавливает 1 только в те строки, которые соответствуют условию фильтрации:

 UPDATE atv_covar
 SET noncomp = 1
 WHERE EXISTS (
     SELECT 'x'
     FROM f4003
     WHERE atv_covar.study = f4003.study
       AND atv_covar.rpid = f4003.rpid
       AND (rsoffrx="81" or rsoffrx="77")
 );

Следующий оператор устанавливает 1 или 2 для всех строк некомпиляции, в зависимости от соответствия фильтрации (используйте это вместо двух обновлений):

 UPDATE atv_covar
 SET noncomp = COALESCE((
     SELECT 1
     FROM f4003
     WHERE atv_covar.study = f4003.study
       AND atv_covar.rpid = f4003.rpid
       AND (rsoffrx="81" or rsoffrx="77")
 ), 2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...