到目前为止,我们一直在使用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。
我们还有另一个更新查询问题,试图根据该表中的另一个字段更新表中的字段。种类递归。
答案 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无需询问即可为您构建索引,在所有其他数据库中,您必须自己明确定义它们。