我正在尝试从MySQL过渡到SQLIte3并遇到更新问题。我在redhat上使用SQLite 3.6.20。
我的第一行代码正常运行
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"));
它运行时不会产生错误,并将atv_covar.noncomp适当地设置为1,它与SELECT语句匹配。问题是它将atv_covar.noncomp的非匹配行更改为null,我希望它将它们保持为2。
select * from atv_covar;
A5202|S182|
A5202|S183|1
A5202|S184|
欢迎任何帮助。
答案 0 :(得分:0)
@Dan,您的查询问题并非特定于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")
);
以下语句为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);