3

我有一张桌子,Foo。我在 Foo 上运行查询以从 Foo 的子集中获取 id。然后我想运行一组更复杂的查询,但仅限于那些 ID。有没有一种有效的方法来做到这一点?我能想到的最好的方法是创建一个查询,例如:

SELECT ... --complicated stuff
WHERE ... --more stuff
  AND id IN (1, 2, 3, 9, 413, 4324, ..., 939393)

也就是说,我构造了一个巨大的“IN”子句。这有效率吗?是否有更有效的方法来执行此操作,或者是与获取 ID 的初始查询一起加入的唯一方法?如果有帮助,我将使用 SQLObject 连接到 PostgreSQL 数据库,并且我可以访问执行查询以获取所有 ID 的游标。

更新:我应该提到,更复杂的查询要么依赖这些 ID,要么创建更多 ID 以在其他查​​询中查找。如果我要进行一个大型查询,我最终会同时连接六个表左右,这可能太慢了。

4

4 回答 4

6

我过去使用的一种技术是将 ID 放入临时表中,然后使用它来驱动一系列查询。就像是:

BEGIN;
CREATE TEMP TABLE search_result ON COMMIT DROP AS
  SELECT entity_id
  FROM entity /* long complicated search joins and conditions ... */;
-- Fetch primary entities
SELECT entity_id, entity.x /*, ... */
FROM entity JOIN search_result USING (entity_id);
-- Fetch some related entities
SELECT entity_id, related_entity_id, related_entity.x /*, ... */
FROM related_entity JOIN search_result USING (entity_id);
-- And more, as required
END;

这在搜索结果实体具有多个一对多关系的情况下特别有用,您希望在没有 a) 执行 N*M+1 选择或 b) 执行相关实体的笛卡尔连接的情况下获取这些关系。

于 2010-06-08T22:55:40.867 回答
1

我认为使用 VIEW 可能很有用。使用您的 ID 查询简单地创建一个视图,然后通过 ID 加入该视图。这会将您的结果限制为所需的 ID 子集,而无需昂贵的 IN 语句。

我确实知道 IN 语句比 EXISTS 语句更昂贵。

于 2010-06-08T22:54:28.950 回答
0

我认为使用标准来选择 id 的连接会更有效,因为查询优化器有更多选项来做正确的事情。使用解释计划来查看 postgresql 将如何处理它。

于 2010-06-08T22:33:38.017 回答
0

几乎可以肯定,使用连接会更好,但是,另一种选择是使用子选择,即

SELECT ... --complicated stuff
WHERE ... --more stuff
  AND id IN (select distinct id from Foo where ...)
于 2010-06-09T04:18:52.577 回答