Postgresql:多次连接同一个表的替代方法

时间:2015-05-28 02:40:47

标签: sql postgresql join database-table

如果我有两个表条目 entry_metadata ,则entry_metadata作为entry_id和变量引用的条目的描述表。

如果我有这个:

输入

Fragments

entry_metadata

Activity

我得到了这张桌子:

id | name   |
-------------
1  | entry1 |
2  | entry2 |
3  | entry3 |

由sql:

id | entry_id | variable | value
1  |    1     | width    | 10
2  |    1     | height   | 5
3  |    2     | width    | 8
4  |    2     | height   | 7
5  |   ...    |  ....    | ..

上面的查询有效。但是当我从条目元数据中添加更多变量来获取值(entry_metadata表包含大量变量)时。查询变得非常慢。每次加入我都会大大减慢执行速度。有办法解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

您也可以使用条件聚合执行此操作:

select id, name,
       max(case when variable = 'width' then value end) as width,
       max(case when variable = 'height' then value end) as height
from public.entry_metadata em
group by id, name;

添加其他列只是添加更多聚合函数。

答案 1 :(得分:1)

只需使用子选择:

SELECT
  e.id,
  e.name,
  (SELECT em.value FROM public.entry_metadata em WHERE em.entry_id = e.id AND em.variable = 'width') AS width,
  (SELECT em.value FROM public.entry_metadata em WHERE em.entry_id = e.id AND em.variable = 'height') AS height
FROM
  public.entry e

因此,对于每个新变量,您只需要再添加一个子选择。

答案 2 :(得分:0)

  

有没有办法解决这个问题?

是的,将entry_metadata表替换为entry中的addtional列(可能的解决方案为hstorejsonb),并使用条目元数据的键值存储。

顺便说一下。你的表代表众所周知的有争议的数据库设计模式,称为"实体属性值"。