2012-03-27 100 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);