2011-04-27 129 views
3

让列说,我有这两个表:SQL获得从一个查询结果到另一个查询

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 

node1node3来自node表,时间戳和Event文本来自events表。

回答

2

这称为交叉表或数据透视查询,并且没有符合SQL的方法来生成一个。

快速谷歌搜索说有contrib module for PostgreSQL(看起来像in core now)。

另一个非常有趣的blog post here(首先在谷歌) - 虽然它不是完全交叉表,因为它有固定的列数。

+0

职能交叉家人看好。我将不得不尝试一点。 – 2011-04-27 14:36:06

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 
相关问题