我有一个表,富。我运行美孚查询从富子集获得的ID。然后我想运行更复杂的查询集合,但只对那些ID。是否有一个有效的方式来做到这一点?我能想到的最好是创建查询,例如:

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

也就是说,我构造一个庞大的“IN”子句。这是有效的?是否有这样做的更有效的方式,或者是与获取ID的inital查询加入的唯一途径?如果有帮助,我使用的SQLObject连接到PostgreSQL数据库,我有机会到执行查询来获取所有的ID光标。

更新:我应该提到的是,更复杂的查询所有要么依靠这些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;

此,其中搜索结果实体具有要没有任何一个做N * M + 1个选择或b取)做了笛卡尔加入相关实体的多个单一对多关系)是特别有用的。

其他提示

我想这可能是使用视图是有用的。简单的创建您的查询ID的视图,然后加入到通过ID这一观点。这会限制你的结果的ID所需的子集,而无需昂贵的声明。

我不知道该报表是更昂贵的那么EXISTS语句应。

我觉得用标准加入到选择的ID会更有效,因为查询优化器有更多的选择,做正确的事。使用解释计划,查看PostgreSQL将如何处理它。

您几乎肯定是一个更好的加入了,但是,另一种选择是使用一个子选择,即。

SELECT ... --complicated stuff
WHERE ... --more stuff
  AND id IN (select distinct id from Foo where ...)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top