SQLite更新查询永远

时间:2017-07-20 18:13:08

标签: sqlite ms-access sql-update inner-join sqlperformance

到目前为止,我们一直在使用MSSQL和Access。我们有一个应用程序,一旦导入所有数据,然后通过许多更新查询。此特定应用程序需要嵌入式数据库。使用MS Access轻松实现内部联接。

我们正在转向SQLite,显然对SQLite来说是新手。

似乎无法在SQLite中使我们的更新查询正确和/或高效。 他们要么永远(实际上永远不会完成),要么不工作。

下面的一个例子是多对一的关系。尝试更新"许多"中的一个字段。表格中的值为" One"表基于两个表中存在的字段。

  

表1(一表)
  字段(ID) - 此字段是唯一的   现场(经理)

  

表2(多表)
  字段(ID) - 此字段中的值不是唯一的,它们链接到   表1中的(ID)字段   现场(联系方式)

以下是我们的查询:

UPDATE [Table 2] SET [Contact] = (SELECT [Manager] FROM [Table 1]
                                  WHERE [Table 2].[ID] = [Table 1].[ID])

我们在SQLite Expert Professional中尝试了这一点,查询永远不会停止运行。表2中只有53,391条记录需要更新。我们每次都必须关闭SQLite Expert应用程序。它只是挂起。

我们将其放入交易中捕获的测试代码中,如下所示:

Using cmd as new SQLiteCommand(cnn)
    Using transaction = cnn.BeginTransaction
        cmd.Transaction = transaction
        cmd.CommandText  = "UPDATE [Table 2] SET [Contact] = (SELECT [Manager] FROM [Table 1] WHERE [Table 2].[ID] = [Table 1].[ID])"
        icount = cmd.ExecuteNonQuery
        transaction.Commit()
    End Using
End Using

这永远不会结束。

这有效:

UPDATE [Table 2] SET [Contact] = (SELECT [Manager] FROM [Table 1]
                                  WHERE [Table 2].[ID] = [Table 1].[ID])
WHERE EXISTS (Select [Manager] FROM [Table 1]
              WHERE [Table 2].[ID] = [Table 1].[ID])

不确定是否有更好或更快的方法?不确定我们是否理解为什么需要WHERE EXISTS。

我们还有另一个更新查询问题,试图根据该表中的另一个字段更新表中的字段。种类递归。

2 个答案:

答案 0 :(得分:2)

当使用带有内部联接的UPDATE语句时,MS Access仅修改联接匹配的行。

使用相关子查询进行简单UPDATE时,如下所示:

UPDATE [Table 2] SET [Contact] = (...)

然后数据库修改所有行。 (当子查询不返回行时,SQLite使用NULL更新该字段;其他DB可能会引发错误。)

如果匹配的行数远小于表中的行数,则重写所有行的速度要慢得多。 然后限制实际修改的行数是有意义的:

UPDATE [Table 2] SET [Contact] = (...)
WHERE EXISTS (...same subquery...)

这与内连接具有相同的效果。

答案 1 :(得分:-1)

SQLite通常比Access快得多。如果没有看到你的DDL和数据,就不可能确切地知道你的问题发生在哪里,但最可能的赌注是你没有在你的ID列上建立索引。 Access无需询问即可为您构建索引,在所有其他数据库中,您必须自己明确定义它们。