我有一個SQL腳本(當前針對SQLite運行,但它應該可能適用於任何數據庫引擎),它使用相同的子查詢兩次,並且因爲它可能會獲取大量記錄(表中有幾百萬行)我想只打一次電話。如何避免重複IN子句的子查詢?
查詢縮短的僞版本是這樣的:
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
),有/無命名的平方等列)但無濟於事。
難道我真的有重複這個子查詢?
澄清: 我這樣做在Python和SQLite作爲什麼可以做一個小的演示,但我想我的解決方案規模以及可能用盡可能少的修改成爲可能。在真實情況下,數據庫將有幾百萬行,但在我的例子中,只有10行含有虛擬數據。因此,代碼將在例如MySQL上得到很好的優化,這絕對是足夠好的 - 它不必爲SQLite專門優化。但正如我所說,需要的修改越少越好。
我不能說SQLite,但最正常的RDBMS應該能夠優化這個。對於某些產品(例如SQL Server,PostgreSQL等),可以通過使用公用表表達式來確保文本只出現一次。 – 2011-03-29 09:31:15
@Damien_The_Unbeliever:鑑於SQLlite是嵌入式數據庫,一方面應該很小,並且不需要支持複雜的,長時間運行的OLAP類型查詢,那麼重量級優化器並不值得增加代碼和運行時間簡短的即席查詢。 – 2011-03-29 11:26:52