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


76

SQLITE

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

我需要将Source.Country值复制到联接在ID上的Destination.Country

对于我一生,我无法让Sqlite做到这一点。

在SQL Server等中,这是一个非常简单的任务。

有想法吗?



1
UPDATE Destination SET country =(在ID = Destination.id的源中选择Country)(在ID = Destination.id的源中选择1);
伊恩·温克

Answers:


152
INSERT INTO Destination SELECT * FROM Source;

有关正式定义,请参见SQLite理解的SQL:INSERT


2
那样就行不通了,因为我需要加入ID字段并且只更新一个字段(国家/地区)。
伊恩·温克

5
您可以轻松地修改SELECT查询中的表达式以匹配您的实际表架构。
joschi 2010年

5
给菜鸟的提示(像我一样)。如果使用多个值,请确保在SELECT查询INSERT INTO users2(name, name2) VALUES ((SELECT name FROM users),(SELECT name2 FROM users));
iceツ

1
@iceツ尽管我的用户表中有多条记录,但这只是在表中插入一条记录
Amardeep Kumar Agrawal

11

如果两个表中都已经有数据,并且您想根据某种条件更新表的列值,请使用

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

如果table2的行少于table1,则这样做将擦除table1中的数据。
zelusp '16

4

我一直在努力,我知道还有其他选择,但是我得出的结论是,最安全的模式是:

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字段。您可以通过明确声明要从中检索的所有列destination_old,或者如果in中的字段为null coalescedestination_old则可以使用来检索值来避免这种情况。因此,例如:countrysource

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;

1

如果您要复制这样的数据,则可能意味着您的数据模型未完全标准化,对吗?是否可以列出一个国家并加入更多国家?

除了使用JOIN之外,您还可以使用虚拟表,这样就不必在系统中更改查询。


我们从一个表更新到另一个表仅是数据清理练习。我只需要更新国家/地区字段(拼写更改)
Ian Vink 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.