2012-03-27 1 views
1

Ich versuche, von MySQL zu SQLIte3 überzugehen und in ein Update-Problem zu laufen. Ich verwende SQLite 3.6.20 auf redhat.sqlite3 UPDATE Generierung von Nullen

Meine erste Zeile Code verhält sich normal

update atv_covar set noncomp= 2; 

Alle Werte für noncomp (in der Spalte ganz rechts) auf 2 entsprechend eingestellt

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

Es ist die zweite Zeile Code, gibt ich Probleme:

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")); 

Es läuft ohne Fehler zu generieren und entsprechend festgelegt v_covar.noncomp auf 1, wo es mit der SELECT-Anweisung übereinstimmt. Das Problem ist, dass es atv_covar.noncomp für die nicht passenden Zeilen verändert auf null, wo ich es will, sie halten als 2.

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

Jede Hilfe willkommen wäre.

Antwort

0

@Dan, das Problem mit Ihrer Abfrage ist nicht spezifisch für SQLite; Sie aktualisieren alle Zeilen von atv_covar, aber nicht alle von ihnen haben Korrespondenz in f4003, so dass diese standardmäßig auf NULL. Sie sollten das Update filtern oder einen Standardwert angeben.

Die folgende Anweisung stellt 1 nur auf die Zeilen, die die Filterbedingung macth:

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") 
); 

Die folgende Anweisung 1 oder 2 für alle Reihen von noncomp setzt, abhängig von dem Filterungs Spiel (dies anstelle von zwei Aktualisierungen):

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);