З огляду на дві таблиці з невизначеним числом рядків з назвою та значенням, як я б відображав перемикання 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
, що 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 без "списку визначення стовпців" для створення такого виду презентації?