Учитывая две таблицы с неопределенным количеством строк с именем и значением, как бы я отобразил функцию поворота CROSS JOIN
над их значениями.
CREATE TEMP TABLE foo AS
SELECT x::text AS name, x::int
FROM generate_series(1,10) AS t(x);
CREATE TEMP TABLE bar AS
SELECT x::text AS name, x::int
FROM generate_series(1,5) AS t(x);
Например, если бы эта функция была умножением, как бы я сгенерировал (умножение) таблицу, как показано ниже,
Все эти (arg1,arg2,result)
строки могут быть сгенерированы с
SELECT foo.name AS arg1, bar.name AS arg2, foo.x*bar.x AS result
FROM foo
CROSS JOIN bar;
Так что это только вопрос представления, я хотел бы, чтобы это также работало с произвольным именем - именем, которое не просто является аргументом CAST
для текста, но установлено в таблице,
CREATE TEMP TABLE foo AS
SELECT chr(x+64) AS name, x::int
FROM generate_series(1,10) AS t(x);
CREATE TEMP TABLE bar AS
SELECT chr(x+72) AS name, x::int
FROM generate_series(1,5) AS t(x);
Я думаю, что это было бы легко выполнимо с CROSSTAB, способным к динамическому типу возврата.
SELECT * FROM crosstab(
'
SELECT foo.x AS arg1, bar.x AS arg2, foo.x*bar.x
FROM foo
CROSS JOIN bar
', 'SELECT DISTINCT name FROM bar'
) AS **MAGIC**
Но, без **MAGIC**
, я получаю
ERROR: a column definition list is required for functions returning "record" LINE 1: SELECT * FROM crosstab(
Для справки, используя приведенные выше примеры с именами , это нечто большее , как то , что tablefunc
«s crosstab()
хочет.
SELECT * FROM crosstab(
'
SELECT foo.x AS arg1, bar.x AS arg2, foo.x*bar.x
FROM foo
CROSS JOIN bar
'
) AS t(row int, i int, j int, k int, l int, m int);
Но теперь мы вернулись к предположениям о содержании и размере bar
таблицы в нашем примере. Так что если,
- Таблицы имеют неопределенную длину,
- Тогда перекрестное соединение представляет куб неопределенного измерения (из-за выше),
- Названия катагорий (на языке кросс-таблицы) приведены в таблице.
Что мы можем сделать лучше всего в PostgreSQL без «списка определений столбцов» для создания такого рода презентации?