【问题标题】:sqlite copy data from one table to anothersqlite 将数据从一个表复制到另一个表
【发布时间】:2011-05-16 12:35:49
【问题描述】:

SQLITE

我有 2 个表“源”和“目标”具有相同的字段。 ID 和 COUNTRY,尽管它们都有其他不通用的字段。

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

为了我的一生,我无法让 Sqlite 做到这一点。

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

想法?

【问题讨论】:

  • 会不会有点像这样? stackoverflow.com/questions/2717590/…
  • UPDATE Destination SET country= (select Country from source where id = Destination.id) WHERE EXISTS (select 1 from source where id = Destination.id);

标签: sql sqlite


【解决方案1】:
INSERT INTO Destination SELECT * FROM Source;

有关正式定义,请参阅 SQL As Understood By SQLite: INSERT

【讨论】:

  • 那不行;因为我需要加入 ID 字段并且只更新一个字段(国家)。
  • 您可以轻松修改SELECT 查询中的表达式以匹配您的实际表架构。
  • 新手注意事项(比如我)。如果使用多个值,请务必将您的 SELECT 查询括起来,例如INSERT INTO users2(name, name2) VALUES ((SELECT name FROM users),(SELECT name2 FROM users));
  • @iceツ 这只是在表中插入一条记录,尽管我的用户表中有多条记录
  • @iceツ 是的,不知道为什么该评论得到了 10 多票,因为它完全错误。操作方法如下: INSERT INTO new_table_name(col1, col2) SELECT col1, col2 FROM old_table_name;
【解决方案2】:

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

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

【讨论】:

  • 如果 table2 的行数少于 table1,则这样做会擦除 table1 中的数据。
  • 除此之外没有其他工作。就我而言。谢谢。 SQLite -> 更新内容集 contentp=(select title.Title from title where title.PageNo = content.PageNo)
【解决方案3】:

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

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 检索的所有列来避免这种情况,如果 source 中的 country 字段为空,则可能使用 coalescedestination_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;

【讨论】:

    【解决方案4】:

    如果您要复制这样的数据,那可能意味着您的数据模型没有完全规范化,对吧?是否可以列出一个国家列表并进行更多的 JOIN?

    您也可以使用虚拟表来代替 JOIN,这样您就不必更改系统中的查询。

    【讨论】:

    • 我们从一个表更新到另一个表只是一个数据清理练习。我只需要更新国家字段(拼写更改)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多