将多行的列列为行(postgresQL)

时间:2014-07-25 13:04:25

标签: sql postgresql select

我试着想一个sql查询来获取由多个记录中的多个列组成的结果,表格如下:

key_1     key_2
--------------------
1         2
1         3
1         4
5         6

key_1和key_2都是来自另一个表的主键。我想要获得的结果是获得与键“1”相关的每个键,即:

key
--------
1
2
3
4

我尝试了以下查询:

SELECT key_1 as key FROM tbl_keys_link WHERE key_1 IN (1)
UNION
SELEVY key_2 as key FROM tbl_keys_link WHERE key_2 IN (1)

但是我使用pgadmin的'Explain'函数检查了它,似乎这个查询的处理时间不是很理想。有没有其他方法来构建查询以实现更好的性能?谢谢!

2 个答案:

答案 0 :(得分:1)

您可以尝试按如下方式填写查询:

select a.key
from anothertable a
where exists (select 1 from tbl_keys_link p pairs.key_1 = a.key and pairs.key_2 = 1) or
      exists (select 1 from tbl_keys_link p pairs.key_2 = a.key and pairs.key_1 = 1);

为了提高性能,您需要两个索引:tbl_keys_link(key_1, key_2)tbl_keys_link(key_2, key1)

这消除了重复消除步骤(不同的需要)。此外,查询应该只扫描另一个表并执行一个或两个索引查找以识别匹配的键。

答案 1 :(得分:0)

你可以试试这个:

with keys as (
  select key_1, key_2
  from tbl_keys_link 
  where key_1 = 1 
     or key_2 = 1
)
SELECT distinct unnest(array[key_1, key_2]) 
from keys
order by 1;

但我不知道这是否更有效率。至少它只需要扫描一次表。如果每列都有索引,Postgres可能会使用这些索引来搜索"相关的"行。