【问题标题】:merging columns from 2 database using sql使用sql合并来自2个数据库的列
【发布时间】:2020-08-31 16:22:32
【问题描述】:

我正在使用两个数据库,主数据库和辅助数据库。两者都包含相同的架构。 现在我不能用辅助数据库中相同列的内容来更新主数据库的列,前提是辅助数据库中的数据不为 NULL。

ATTACH "secondary.db" as second;
UPDATE main.table set main.value = coalesce((SELECT value FROM second.table),main.value);

但是上面的代码不起作用,只有辅助数据库中列的第一个值被复制到主数据库中列中的所有值。

例如。 主数据库:

index, value
  1,    45
  2,    56
  3,    23

二级数据库:

index, value
  1,   NULL
  2,   55
  3,   NULL

预期结果数据库:

index, value
  1,    45
  2,    55
  3,    23

有什么建议吗?

在这里你可以看到我在尝试什么: http://sqlfiddle.com/#!5/845545/1

【问题讨论】:

  • 请提供样本数据和期望的结果。哪些列链接了两个表中的行?
  • 用示例数据集编辑了问题

标签: sql database sqlite


【解决方案1】:

我已经有几年没有跟上 SQLite 的步伐了,但我认为您现在可以使用这样的 UPDATE FROM 语句来做到这一点:

UPDATE 
   main
SET 
   main.value = Coalesce (main.value, second.value)
FROM
      main.table
   INNER JOIN
      second.table
   ON main.id = second.id

【讨论】:

  • 优先级为从库,如果从库中存在该值,则应覆盖主库中的值。在我的情况下如何使用 JOIN 或 WHERE 子句?
  • 如何访问 second.value?我试过Coalesce (main.value, second.table.value),但它抱怨“没有这样的专栏”
  • @Kuru 。 . .供参考。 UPDATE FROM 是在 2019 年 10 月发布的 SQLite 3.30 中引入的。如果您没有跟上 SQLite,那么 SQLite 中从来没有这种语法。另外,SQLite 中对正在更新的表的命名是不正确的。
【解决方案2】:

我认为你需要一个 correlated 子查询:

update main.table t
    set main.value = coalesce((select t2.value from second.table t2 where t2.index = t.index),
                              main.value
                             );

或者,更有效。过滤行,不要使用coalesce()

update main.table t
    set main.value = (select t2.value from second.table t2 where t2.index = t.index)
    where exists (select 1 from second.table t2 where t2.index = t.index and t2.value is not null)

【讨论】:

  • 这两个建议都导致使用辅助数据库中列的第一个值填充主数据库列。 :(
  • @rkthebest 。 . .你做错了什么。使用的是第二个表中对应的值,并不是每一行的值都一样。
  • sqlfiddle.com/#!5/845545/1 看看这里,这就是我正在做的事情
  • @rkthebest 。 . .如果您正确编写查询(如答案中所述),它将执行您想要的操作:sqlfiddle.com/#!5/845545/3.
  • 非常感谢您的帮助!!它完全解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
相关资源
最近更新 更多