我需要写一个查询来检索一个大的ID列表.

我们确实支持许多后端(MySQL、Firebird、SQLServer、Oracle、PostgreSQL…)我需要写一个标准的SQL.

id集的大小可能很大,查询将以编程方式生成.那么,最好的方法是什么?

1) 使用IN编写查询

SELECT * FROM TABLE WHERE ID IN (id1, id2, ..., idn)

我的问题是.如果n非常大会发生什么?还有,性能呢?

2) 使用或编写查询

SELECT * FROM TABLE WHERE ID = id1 OR ID = id2 OR ... OR ID = idn

我认为这种方法没有n限制,但是如果n非常大,性能如何?

3) 编写编程解决方案:

  foreach (var id in myIdList)
  {
      var item = GetItemByQuery("SELECT * FROM TABLE WHERE ID = " + id);
      myObjectList.Add(item);
  }

当通过网络查询数据库服务器时,这种方法遇到了一些问题.通常情况下,执行一个检索所有结果的查询比执行大量小查询更好.也许我错了.

这个问题的正确解决方案是什么?

推荐答案

选项1是唯一好的解决方案.

为什么?

  • 选项2也有同样的功能,但是你重复了很多次列名;此外,SQL引擎不会立即知道您想要判断该值是否是固定列表中的值之一.然而,一个好的SQL引擎可以优化它,使其具有与IN相同的性能.不过还是有可读性问题...

  • 选项3的性能非常糟糕.它会在每个循环中发送一个查询,并用小查询敲打数据库.它还阻止它对"值是给定列表中的值之一"进行任何优化

Sql相关问答推荐

如何查询一个名称是根据PL/pgSQL函数结果构建的表?

具有2个共享列的两个表的Amazon RSQL合并

LAG函数通过丢弃空值返回前一行

如何退回当年的所有参赛作品?""

对非RUST源代码字符串使用`stringify!`,例如SQL查询

如何更新SQLite数据库中的表?

PostgreSQL:按小时查看调整日期

我可以在SQL的IN子句中使用比子查询包含的值更少的值吗?

在SQL Server中设置关联对象的有效JSON格式

在MS Access Modern图表的X轴上显示时间值时遇到问题

使用多个WITH子查询的替代方法

将具有嵌套 XML 的列转换为 SQL 中的表格格式?

如何根据 Google BigQuery 中的特定列值连接一列的 N 行?

我们可以使用连接改进包含多个子查询的查询吗

SQL Server - 判断 ids 层次 struct 中的整数 (id)

使用ALTER TABLE无法删除列

SQL 按 id 运行总计并受条件限制(在窗口上)

SQL:如何从时间戳数据生成时间序列并计算不同事件类型的累计总和?

在 BigQuery 数据集中查找表大小和占总数据集大小的百分比

如何找到特定时间间隔内的最大和最小日期?