我需要检索与列表中存储的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的行。
这不 有 是一个临时表,当然,你可以让它躺在身边只要你保证只有一个“东西”使用它一次。