Създайте примерна таблица:
CREATE TEMP TABLE foo (id int, a text, b text, c text);
INSERT INTO foo VALUES (1, 'ant', 'cat', 'chimp'), (2, 'grape', 'mint', 'basil');
Можете да „отмените“ или „премахнете кръстосаната таблица“ с помощта на UNION ALL:
SELECT id,
'a' AS colname,
a AS thing
FROM foo
UNION ALL
SELECT id,
'b' AS colname,
b AS thing
FROM foo
UNION ALL
SELECT id,
'c' AS colname,
c AS thing
FROM foo
ORDER BY id;
Това изпълнява 3 различни подзаявки на foo
, по един за всяка колона, която искаме да отменим, и връща в една таблица всеки запис от всяка от подзаявките.
Но това ще сканира таблицата N пъти, където N е броят на колоните, които искате да отмените. Това е неефективно и е голям проблем, когато например работите с много голяма маса, сканирането на която отнема много време.
Вместо това използвайте:
SELECT id,
unnest(array['a', 'b', 'c']) AS colname,
unnest(array[a, b, c]) AS thing
FROM foo
ORDER BY id;
Това е по-лесно за писане и ще сканира таблицата само веднъж.
array[a, b, c]
връща обект на масив със стойностите на a, b и c като елементи.unnest(array[a, b, c])
разбива резултатите на един ред за всеки от елементите на масива.
Надявам се това да помогне!