2012-03-27 98 views
1

我想从MySQL转换到SQLIte3并运行到更新问题。我在redhat上使用SQLite 3.6.20。sqlite3更新生成空值

我的第一行代码行为正常

update atv_covar set noncomp= 2; 

为noncomp所有值(在最右边的列)被适当地设定为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")); 

它运行时没有产生错误,并适当地设置在将v_covar.noncomp设置为1,与SELECT语句匹配。问题是,它改变atv_covar.noncomp为不匹配的行空,在这里我想给他们留做2

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

任何帮助将受到欢迎。

回答

0

@丹,您的查询的问题不是特定于SQLite;您正在更新atv_covar的所有行,但并非所有行都对应于f4003,因此这些默认为NULL。您应该过滤更新或提供默认值。

下面的语句将1只对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") 
); 

以下语句noncomp的所有行依赖于该滤波的匹配组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);