SQL для получения результата от одного запроса в виде столбцов к другому запросу - PullRequest
3 голосов
/ 27 апреля 2011

Допустим, у меня есть две таблицы:

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.

Ответы [ 2 ]

2 голосов
/ 27 апреля 2011

Это называется кросс-таблицей или сводным запросом, и не существует SQL-совместимого способа его создания.

Быстрое поиск в Google говорит, что для PostgreSQL имеется модуль contrib (выглядит как в ядре теперь ).

Еще один довольно интересный пост в блоге здесь (сначала в Google) - хотя это не полностью кросс-таблица, поскольку в нем зафиксировано количество столбцов.

1 голос
/ 27 апреля 2011

Использование группировки и агрегирования в выражениях 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...