Maak een voorbeeldtabel:
CREATE TEMP TABLE foo (id int, a text, b text, c text);
INSERT INTO foo VALUES (1, 'ant', 'cat', 'chimp'), (2, 'grape', 'mint', 'basil');
U kunt de draaiing ongedaan maken of de kruistabel opheffen met 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;
Dit voert 3 verschillende subquery's uit op foo
, één voor elke kolom die we ongedaan willen maken, en retourneert in één tabel elk record van elk van de subquery's.
Maar dat zal de tabel N keer scannen, waarbij N het aantal kolommen is dat u wilt ongedaan maken. Dit is inefficiënt en een groot probleem wanneer u bijvoorbeeld werkt met een zeer grote tabel die veel tijd kost om te scannen.
Gebruik in plaats daarvan:
SELECT id,
unnest(array['a', 'b', 'c']) AS colname,
unnest(array[a, b, c]) AS thing
FROM foo
ORDER BY id;
Dit is gemakkelijker te schrijven en het zal de tabel maar één keer scannen.
array[a, b, c]
geeft een array-object terug, met de waarden van a, b en c als elementen.unnest(array[a, b, c])
verdeelt de resultaten in één rij voor elk van de elementen van de array.
Ik hoop dat dat helpt!