在PostgreSQL中创建数据库表的宽视图

时间:2016-09-14 00:18:12

标签: sql postgresql

我有一个PostgreSQL表,它存储有关不同物理对象的属性。它包含以下字段:

object_name
attr_name (string e.g. attr_1, attr_2 etc.)
attr_value (number)
date_modified (date)
priority (integer)

同一attr_name可能有许多不同的值,这些值将在不同日期添加,并且具有不同的优先级(表示源的准确性),因此我需要此结构以便以后跟踪。

我想创建一个这个表的视图,以便我可以有效地查询多个(~100)属性,例如。

SELECT * FROM View1 WHERE attr_1 = 5 and attr_2 > 3 etc.

所以为了做到这一点,我想我需要一个包含以下字段的视图:

object_name
attr_1
attr_2
etc.

每个属性attr_x应包含原始表中属性的最高优先级版本。有谁知道如何做到这一点?我只知道非常基本的SQL,所以我甚至不知道这是什么或者是否可能。有没有人在任何SQL类型的数据库中做过这个?如果可能的话,我想避免使用2个单独的表格。很高兴接受任何其他可以实现可追溯性和快速查询要求的解决方案。

1 个答案:

答案 0 :(得分:0)

这是一个示例查询,它以您希望的格式返回具有最高优先级的所有值:

SELECT
    object_name,
    (SELECT attr_value AS attr_1
     FROM t
     WHERE t.object_name=t1.object_name AND attr_name='attr_1'
     ORDER BY priority DESC LIMIT 1),
    (SELECT attr_value AS attr_2
     FROM t
     WHERE t.object_name=t1.object_name AND attr_name='attr_2'
     ORDER BY priority DESC LIMIT 1)
FROM (SELECT DISTINCT object_name FROM t) t1;

我假设该表名为t。该查询返回2 attr_???列。如果还有更多,则必须添加更多子查询,每列一个。如果你不喜欢(例如因为你有大量的attr_name),那么我们可以做一些不需要编写大量查询的东西,但它会将结果作为JSON对象返回(所以它将采用不同的格式。)

如果要创建视图,只需运行以下命令:

CREATE VIEW myview AS SELECT ...
                      ^^^ insert the query from above

如果您需要尽可能快,我建议使用2个表:一个表示最高优先级值,另一个表示其他表。