我有一个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
个案,而且每个字段的值都由select检索。
我想/希望有一种更简单,更易于维护的方法。
答案 0 :(得分:1)
您可能会认为这更易于维护,
至少它有一些"三重复制代码"少:
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)
;
详细说明:
ifnull
使条件值更简单,更短在SQLite 3.9.1上测试,使用固定值而不是%d
。