एक उदाहरण तालिका बनाएं:
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;
यह foo
. पर 3 अलग-अलग सबक्वेरी चलाता है , प्रत्येक कॉलम के लिए एक जिसे हम अनपिवट करना चाहते हैं, और एक तालिका में, प्रत्येक सबक्वेरी से प्रत्येक रिकॉर्ड लौटाता है।
लेकिन वह तालिका को 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]
ए, बी, और सी के मानों के साथ एक सरणी ऑब्जेक्ट देता है क्योंकि यह तत्व है। unnest(array[a, b, c])
प्रत्येक सरणी के तत्वों के लिए परिणामों को एक पंक्ति में तोड़ता है।
आशा है कि इससे मदद मिलेगी!