【发布时间】:2011-07-25 03:12:04
【问题描述】:
我有一个 SQL 脚本(目前针对 SQLite 运行,但它可能适用于任何数据库引擎)两次使用相同的子查询,因为它可能会获取大量记录(该表有几百万行) 我只想调用一次。
查询的缩短伪版本如下所示:
SELECT * FROM
([the subquery, returns a column of ids]) AS sq
[a couple of joins, that fetches things from other tables based on the ids]
WHERE thisorthat NOT IN ([the subquery again])
我尝试以各种方式(带/不带括号,带/不带命名 sq 列等)仅使用名称 (sq),但无济于事。
我真的有重复这个子查询吗?
说明: 我在 python 和 sqlite 中做这个作为 可以 做的一个小演示,但我希望我的解决方案在尽可能少的修改的情况下尽可能地扩展。在实际情况下,数据库将有几百万行,但在我的示例中,只有 10 行带有虚拟数据。因此,可以在 MySQL 上进行很好优化的代码 绝对足够好 - 它不必专门针对 SQLite 进行优化。但正如我所说,需要的修改越少越好。
【问题讨论】:
-
我不能代表 SQLite,但大多数体面的 RDBMS 应该能够优化这一点。对于某些产品(例如 SQL Server、postgreSQL 等),您可以使用常用的表表达式来确保文本只出现一次。
-
@Damien_The_Unbeliever:鉴于 SQLlite 是一个嵌入式数据库,一方面应该很小,并且不需要支持复杂的、长时间运行的 OLAP 类型查询,所以重量级的优化器真的不值得增加临时查询的代码和运行时间增加。
标签: sql subquery dry in-clause