我有一个 sqlite3具有不同表的数据库。
我正在做的是 UPDATE
表的最后插入行,其中包含来自同一表的另一条记录或来自另一个类似表的数据。
我成功了,但我想知道我的解决方案是否正确或缺少某些内容,以及我是否可以用更紧凑、更快速的方式编写它。
此外,我的代码非常难以管理,因为如果将来表结构发生变化,我将必须重写查询以添加或删除字段。
我在犹豫是否可以写一个 sql从表中获取整条记录并更新同一表的另一条记录中的所有 NULL
字段的查询。
sprintf(global_sql, "UPDATE "\
"Table1 "\
"SET "\
"fiedl1 = case when fiedl1 is null then (SELECT fiedl1 FROM Table1 WHERE Table1_id = %d) else fiedl1 end, "\
"fiedl2 = case when fiedl2 is null then (SELECT fiedl2 FROM Table1 WHERE Table1_id = %d) else fiedl2 end, "\
"fiedl3 = case when fiedl3 is null then (SELECT fiedl3 FROM Table1 WHERE Table1_id = %d) else fiedl3 end "\
"WHERE "\
"Table1_id = (SELECT max(Table1_id) FROM Table1)", sourceRecord_idx, sourceRecord_idx, sourceRecord_idx);
如您所见,对于每个字段,我必须编写其特定的 SET
案例,而且每个字段的值都是通过选择检索的。
我想/希望有一种更简单、更易于维护的方法来做到这一点。
最佳答案
您可能会认为这更易于维护,
至少它少了一些“三重复制代码”:
with shortcut(f1, f2, f3) as
(SELECT fiedl1, fiedl2, fiedl3 FROM Table1 WHERE Table1_id = %d)
UPDATE Table1 SET
fiedl1 = ifnull(fiedl1, (SELECT f1 FROM shortcut)),
fiedl2 = ifnull(fiedl2, (SELECT f2 FROM shortcut)),
fiedl3 = ifnull(fiedl3, (SELECT f3 FROM shortcut))
WHERE Table1_id = (SELECT max(Table1_id) FROM Table1)
;
详细信息:
- 使用 CTE 减少条件重复和其他快捷方式
- 使用
ifnull
使条件值更简单、更短
在 SQLite 3.9.1 上测试,使用固定值而不是 %d
。
关于c - 来自另一个表的 SQLITE UPDATE 字段 IF NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32840729/