Sqlite数据多表联合update
Sqlite数据多表联合update
其实在Mysql中,多表联合update不是什么难事。
UPDATE table_references SET col_name1=expr1 [, col_name2=expr2 ...] [WHERE where_definition]
UPDATE table1, table2 SET table1.value=table2.value, a.type=b.type WHERE table1.sid=table2.sid;
同样的,在SqlServer中也可以很简单的用联合来实现:
UPDATE t1 SET col1=t2.col1 FROM table1 t1 INNER JOIN table2 t2 ON t1.col2=t2.col2;
但是,很可惜,在Sqlite中却不支持这样的语法,那是不是Sqlite中就不支持多表联合update呢?当然不是的,其实Sqlite中多表联合update也可以实现,
首先,Sqlite里面有一个新鲜玩意“INSERT OR REPLACE”,跟Mysql类似,这个结构能够保证在存在的情况下替换,不存在的情况下更新,用这个机制就可以轻松实现Update…From了。
INSERT OR REPLACE INTO t1(key, Column1, Column2) SELECT t2.key, t2.Column1,t2.Column2 FROM t2, t1 WHERE t2.key = t1.key;
这种方法要避免插入操作,首先要确保是依照主键执行的更新,如果where条件不是主键可能就有点麻烦了。
要是不是主键的更新怎么办能?另外还有其他的办法吗?我们在这中情况下只能向典型的Update…where寻求帮助了,下面是一个例子:
UPDATE table1 SET col1 = 1 WHERE table1.col2 = (SELECT col2 FROM table2 WHERE table2.col2 = table1.col2 AND table2.col3 = 5);
场景:SQLite的多个字段update语句
求一个SQLite的多个字段update语句
af1,af2,atype
bf1,bf2,btype
======================================
下面的语句可以执行
update a set af1=(select bf1 from b where btype=a.atype);
但是我想同时将af2也更新了怎么写?
------解决方案--------------------
update a set af1=(select bf1 from b where btype=a.atype),
af2=(select bf2 from b where btype=a.atype)
最近遇到一个比较蛋疼的问题,有city_2、city_3两张表,需要将city_3中的部分数据复制到city_2中的某一字端上,如是在MYSQL下写了如下sql语句
update city_2 set city_2.city = city_3.city from city_2, city_3 where city_2.childCode = city_3.childCode
执行是没有问题的,然而当我在sqlite中去执行该语句的时候发现该语句报错,原来是sqlite不支持该语法,如是修改
update city_2 set
city=(select city from city_3 where city_2.childCode = city_3.childCode)
where
childCode = (select childCode from city_3 where city_3.childCode = city_2.childCode)
然后执行的时候发现没有问题。
Sqlite的多表连接更新
最近处理一个较大数据的sqlite库,基础表300万条,结果表30万条左右,我的笔记本跑起来还算流畅。最后结果,需要两个表连接,把另一个表的计算结果更新过来,却遇到麻烦。sqliter并不支持常见的连接更新:
update a set a.id =b.id from table_1 a inner join table_2 b on a.name=b.name
查了一下,只能这样:
update table1 set col1=(select col1 from table2 where col2=table1.col2)
试了一下,太慢了。
最后找了一个折中的办法:
1.把连接写成视图
2.导出结果到csv