假设我有这两个表:
CREATE TABLE nodes
(
id INTEGER PRIMARY KEY,
name TEXT
);
CREATE TABLE events
(
id INTEGER PRIMARY KEY,
node INTEGER REFERENCES nodes,
etime TIMESTAMP,
value TEXT
);
是否有查询将nodes
表中的值作为events
表的列?
对于一个简单的例子,我想要这样的东西:
node1 | node2 | node3
-------+--------+--------
event1 | |
| event2 |
| | event3
这可能吗?
我真的想要的是一个SQL查询,可以输出这样的内容:
etime | node1 | node2 | node3
--------------------+---------+---------+--------
2011-04-26 13:12:23 | Event 1 | | Event 2
2011-04-26 15:52:43 | | Event 3 |
2011-04-26 21:35:12 | Event 4 | Event 5 | Event 6
node1
到node3
来自node
表的位置,时间戳和Event
文本来自events
表。
答案 0 :(得分:2)
这称为交叉表或数据透视查询,并且没有符合SQL的方法来生成一个。
快速谷歌搜索说有一个contrib module for PostgreSQL(看起来像in core now)。
另一个非常有趣的blog post here(谷歌中的第一个) - 虽然它不是完全交叉表,因为它有固定数量的列。
答案 1 :(得分:1)
在CASE表达式上使用分组和聚合:
SELECT
e.etime,
MIN(CASE n.name WHEN 'node1' THEN e.value END) AS node1,
MIN(CASE n.name WHEN 'node2' THEN e.value END) AS node2,
MIN(CASE n.name WHEN 'node3' THEN e.value END) AS node3
FROM events e
INNER JOIN nodes n ON e.node = n.id
GROUP BY