我有一个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个单独的表格。很高兴接受任何其他可以实现可追溯性和快速查询要求的解决方案。
答案 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个表:一个表示最高优先级值,另一个表示其他表。