2011-04-27 130 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 
相關問題