sqlite将数据从一个表复制到另一个表

问题描述:

SQLITEsqlite将数据从一个表复制到另一个表

我有2个表“Source”和“Destination”具有相同的字段。 ID和COUNTRY,尽管它们都有其他领域也不相同。

我需要的Source.Country值复制到Destination.Country其中加入是ID

对于我的生活,我不能让sqlite的做到这一点。

在SQL Server等这是一个超级简单的任务。

想法?

+1

更新目的地 SET国家=(选择国家从源其中id = Destination.id) WHERE EXISTS(从源选择1其中id = Destination.id); – 2010-11-27 12:04:45

+0

会有点像这样吗? http://stackoverflow.com/questions/2717590/sqlite-upsert-on-duplicate-key-update – Tom 2010-11-27 11:20:46

INSERT INTO Destination SELECT * FROM Source; 

查看SQL As Understood By SQLite: INSERT的正式定义。

+1

赢得;吨工作,因为我需要加入ID字段,只更新一个字段(国家)。 – 2010-11-27 11:17:23

+4

您可以在`SELECT`查询中轻松修改表达式以匹配您的实际表格模式。 – joschi 2010-11-27 12:17:47

如果您正在复制这样的数据,那可能意味着您的数据模型没有完全标准化,对吗?是否可以创建一个国家/地区列表并加入更多联盟?

而不是JOIN你也可以使用虚拟表,所以你不必改变系统中的查询。

如果已经存在两个表中的数据,你要根据一些条件来更新表列的值,然后用这个

UPDATE Table1 set Name=(select t2.Name from Table2 t2 where t2.id=Table1.id) 

我一直在摔跤这个问题,而且我知道有其他的选择,但我得出的结论是最安全的模式是:

create table destination_old as select * from destination; 

drop table destination; 

create table destination as select 
d.*, s.country 
from destination_old d left join source s 
on d.id=s.id; 

它是安全的,因为你有destination副本你改变它。我怀疑带有连接的更新语句不包含在SQLite中,因为它们功能强大但有点风险。

使用上面的模式,最终得到两个country字段。如果source中的country字段为空,则可以通过明确声明要从destination_old中检索的所有列以及可能使用​​3210检索destination_old中的值来避免这种情况。因此,例如:

create table destination as select 
d.field1, d.field2,...,coalesce(s.country,d.country) country 
from destination_old d left join source s 
on d.id=s.id;