1

有人可以帮我优化我的 SQL 查询。数据库是postgres。我的表结构如下:

create table test_table(test_id integer NOT NULL, sequence_id integer NOT NULL,value1 integer NOT NULL, value2 integer NOT NULL, CONSTRAINT test_table_pk PRIMARY KEY (test_id , sequence_id ))

create table test_event(event_id integer NOT NULL,test_id integer NOT NULL, sequence_id integer NOT NULL , CONSTRAINT test_event_pk PRIMARY KEY(event_id , test_id, sequence_id))

test_table
1,1, 200,300
2,2, 400,500
2,3, 600,700
2,4, 300,500
2,5, 200,900

test_event
1, 1,1
1, 2,2
1, 2,3
2, 2,4
2, 2,5

我想从 test_table 中获取所有 value1 和 value2,其中 sequence_id 和 test_id 对应于 test_event 中的 event_id =1。我的查询看起来像

SELECT
  value1, value2
FROM
  test_table
WHERE
  sequence_id IN (
    SELECT sequence_id
    FROM test_event
    WHERE event_id=1) AND
  test_id IN (
    SELECT test_id
    FROM test_event
    WHERE event_id=1)

有人可以告诉我这是否是编写此查询的最佳方式吗?

4

2 回答 2

3

您可以使用 anINNER JOIN来优化您的查询,这样您就不必在不同的属性上查询 'test_event' 表两次。

SELECT t.value1, t.value2
FROM test_table t, test_event e 
WHERE e.event_id = 1 
    AND t.test_id = e.test_id 
    AND t.sequence_id = e.sequence_id

编辑:添加了评论中提供的建议。

SELECT t.value1, t.value2  
FROM test_table t INNER JOIN test_event e  
ON ( e.event_id = 1  
    AND t.test_id = e.test_id 
    AND t.sequence_id = e.sequence_id)
于 2013-07-01T21:30:24.747 回答
1

问题是是否sequence_idtest_id必须来自test_event. 例如,对 (1, 2) 满足原始查询,因为偶数 id 1 序列 id 2 都在 with 行上,event_id = 1但它们不在同一行上。

您的in查询可能是表达这种关系的最佳方式。另一种方法是使用join和聚合:

SELECT tt.value1, tt.value2
FROM test_table tt join
     test_event te
     on te.event_id = 1
group by tt.value1, tt.value2
having sum(case when tt.sequence_id = te.sequence_id then 1 else 0 end) > 0 and
       sum(case when tt.event_id = t2.event_id then 1 else 0 end) > 0;

这用injoin基本上是交叉连接)和aggregation. 我猜想在te.sequence_id和上使用索引te.event_id,您的原始版本会更好。

于 2013-07-02T02:05:28.027 回答