SQL将一个查询的结果作为另一个查询的列

时间:2011-04-27 11:34:03

标签: sql postgresql

假设我有这两个表:

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 个答案:

答案 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