如何在Objective C中的SQLite中使用内部连接?

时间:2014-07-30 04:07:47

标签: ios objective-c sqlite

我想从查询中更新整个表。以下是我的更新功能:

  1. 存储在iDevice中的数据库(数据库A)
  2. Temperory Database(Batabase B)下载到设备并存储在设备内的temp文件夹中。 (两个DB都具有相同的数据库结构)
  3. 首先我将temp db附加到设备数据库。附加的数据库名称是SECOND1
  4. 然后我从temp db向设备文件夹插入以下插入代码的新记录。它工作正常。

    INSERT INTO main.fList SELECT * FROM SECOND1.fList WHERE not exists (SELECT 1 FROM main.fList WHERE main.fList.GUID = SECOND1.fList.GUID)

  5. 但是当我使用以下代码进行更新时,它无法正常工作。它为所有设备数据库表的行更新相同的最高值。

    UPDATE fList SET Notes = (SELECT SECOND1.fList.Notes FROM SECOND1.fList WHERE SECOND1.fList.GUID = fDefectList.GUID) WHERE EXISTS (SELECT * FROM SECOND1.fList WHERE SECOND1.fList.GUID = fList.GUID

  6. 我发现批量更新的 SQL查询。以下是代码,

    UPDATE fTempRank7
    SET
     fTempRank7.int_key = fRank7.int_key,
     fTempRank7.int_rank6 = fRank7.int_rank6,
     fTempRank7.title = fRank7.title,
     fTempRank7.sequence = fRank7.sequence,
     fTempRank7.lastupdated = fRank7.lastupdated 
    FROM
     fTempRank7 INNER JOIN fRank7 ON
     fTempRank7.int_key = fRank7.int_key
    

    但是在sqlite中,这段代码不起作用。

    任何人都知道 sqlite中的批量更新

1 个答案:

答案 0 :(得分:0)

SQLite不支持UPDATE语句中的连接。

当您使用没有数据库名称的表名时,它引用最里面查询中的第一个匹配表。换句话说,如果您在子查询中使用SECOND1.fList,则fList中的任何其他位置都会引用SECOND1中的表格。

要确保始终引用正确的表,请在所有表引用中使用数据库名称。 主数据库的名称始终为main,因此所有表引用都应为main.fListSECOND1.fList


无论如何,如果要更新所有列,可以通过删除要更新的行来简化更新,以便只插入所有新数据:

BEGIN;
DELETE FROM fList WHERE GUID IN (SELECT GUID FROM SECOND1.fList);
INSERT INTO fList SELECT * FROM SECOND1.fList;
COMMIT;

GUID列上有UNIQUE约束时,可以将其简化为单个语句:

INSERT OR REPLACE INTO fList SELECT * FROM SECOND1.fList;

在这里,我不会使用main.,因为我知道自己在做什么。 ☺