3 回答

TA貢獻2011條經驗 獲得超2個贊
創(chuàng)建一個示例表:
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是您要取消透視的列數(shù)。這效率低下,而且是一個很大的問題,例如,當您使用非常大的表進行掃描時,這需要很長時間。
而是使用:
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]返回一個數(shù)組對象,其值分別為a,b和c。 unnest(array[a, b, c])將數(shù)組的每個元素的結果分成一行。
希望有幫助!
添加回答
舉報