在SQLite中合并时在UPDATE语句中使用JOINS

时间:2014-07-30 12:39:55

标签: sql database sqlite

我目前正在使用分布式SQLite数据库。 每个客户端都有自己的数据库,可以与服务器数据库同步。

服务器从客户端接收数据库,并根据客户端发送的数据库更新并插入自己的行。

插入新记录非常简单:

ATTACH DATABASE 'clients_uploaded_db' AS toMerge;
INSERT INTO `presentation` SELECT * FROM toMerge.presentation WHERE id NOT IN (
    SELECT id FROM `presentation`
)

更新不是。我需要检查客户端记录是否已更改(presentation.changedate的值小于客户端数据库中的presentation.changedate)并在必要时进行更新。

在MySQL等DBMS中,以下是可能的。但是在SQLite中使用UPDATEs上的连接是不可能的。

ATTACH DATABASE 'clients_uploaded_db' AS toMerge;
UPDATE presentation 
INNER JOIN toMerge.presentation AS tp ON
   id = tp.id 
SET
    label = tp.label
WHERE 
    tp.changedate > changedate

我已经阅读了几个SO问题,但我只能找到只需要更新一行或知道身份的地方的解决方案。


DB-结构

server_db:

演示文稿( id:pk,label,changedate

clients_uploaded_db:

演示文稿( id:pk,label,changedate


TL; DR

我无法在UPDATE上连接表,但是我需要使表的行与我的查询中可用的另一个数据库上的表上的行完全相同,但仅限于{{1}第二个数据库的col高于第一个数据库的col。


到目前为止我做了什么

  • 试图加入有关表格
  • 以编程方式迭代记录并在必要时进行更新(工作正常但是性能杀手)

1 个答案:

答案 0 :(得分:1)

SQLite不支持from子句。因此,您必须使用相关子查询执行此操作。目前尚不清楚您的更新应该做什么。但这是一个例子

UPDATE presentation 
SET label = (select tp.label
             from toMerge.presentation tp
             where presentation.id = tp.id and
                   tp.changedate > presentation.changedate
             order by tp.change_date
             limit 1);