sql - 在 SQLite WHERE 子句中组合大量条件

标签 sql performance sqlite

我需要检索与存储在列表中的 ID 相匹配的记录。在运行时生成的查询很简单:

SELECT [whatever FROM sometable] WHERE (id = 1) or (id = 5) or (id = 33).

相当于

SELECT [whatever FROM sometable] WHERE [id] IN (1, 5, 33);

这很好,但是如果列表包含数百或数千个 ID 怎么办?该语句将是巨大的,并且在某些时候 SQL 解析器可能会崩溃,或者如果没有,性能可能会非常糟糕。 我怎样才能以对检索的记录数量不太敏感的方式执行此操作?

(我不能只遍历列表并一条一条检索记录的原因是我需要数据库为我执行 ORDER BY。记录必须来自按特定字段排序的数据库,而该列表表示用户在网格中选择的记录,可以用多种方式排序。是的,我可以在检索记录后用代码对记录进行排序,但那是计划 B,因为我什至不需要持有它们都在一个数据结构中,只是为了正确排序。)

最佳答案

如果您真的要拥有太多 ID,以至于担心 SQL 解析器崩溃,您可以将它们存储到一个临时表中并进行交叉连接。

只需用一个(主键)列和 ID 创建表,然后用所需的 ID 填充它并使用类似的东西:

SELECT [whatever] FROM [sometable] st, [idtable] it
WHERE st.id = it.id

该查询不会阻塞任何解析器,检索的行将仅限于具有临时表中 ID 的行。

不一定是临时表,当然,只要确保一次只有一个“事物”使用它,您可以将它放在身边。

关于sql - 在 SQLite WHERE 子句中组合大量条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9041476/

相关文章:

mysql - 如果 SQL 表中有两种类型的行,并且我想选择其中一种但接受另一种

java - 了解 Fastutil 内部的资源

c++ - 考虑到干净代码的性能,什么更好

java.sql.SQLException : column id is not unique

javascript - 使用 SQL 查询中的 PHP 变量回显 JS 函数

mysql - SQL,如何计算范围内的行数

sql - 在事先不知道模式的情况下解析 XML 的更好方法

java - 在 Java JNI 中测量时间( native 调用 Java)

java - 有什么好的安卓开发ORM工具吗?

android - cursor.getString() 抛出的 CursorIndexOutOfBoundsException