मूल प्रश्न का उत्तर
Postgres सेट-रिटर्निंग फ़ंक्शंस (SRF) को पंक्तियों को गुणा करने की अनुमति देता है। generate_series()
आपका दोस्त है:
INSERT INTO b (all_names, birthday)
SELECT names, current_date -- AS birthday ??
FROM (SELECT names, generate_series(1, number) FROM a);
LATERAL
. की शुरुआत के बाद से पोस्टग्रेज 9.3 में आप मानक SQL से चिपके रह सकते हैं:SRF SELECT
. से चलता है FROM
. तक सूची:
INSERT INTO b (all_names, birthday)
SELECT a.names, current_date -- AS birthday ??
FROM a, generate_series(1, a.number) AS rn
LATERAL
यहाँ निहित है, जैसा कि मैनुअल में बताया गया है:
LATERAL
फ़ंक्शन-कॉल से पहले FROM
. भी हो सकता है आइटम, लेकिन इस मामले में यह एक शोर शब्द है, क्योंकि फ़ंक्शन अभिव्यक्ति किसी भी मामले में पहले से आइटम से संदर्भित कर सकती है।
रिवर्स ऑपरेशन
ऊपर एक साधारण समुच्चय का उल्टा ऑपरेशन (लगभग) है count()
:
INSERT INTO a (name, number)
SELECT all_names, count(*)
FROM b
GROUP BY 1;
... जो आपके अपडेट किए गए प्रश्न में फिट बैठता है।
count(*)
. के बीच एक सूक्ष्म अंतर पर ध्यान दें और count(all_names)
. पूर्व सभी पंक्तियों की गणना करता है, चाहे कुछ भी हो, जबकि बाद वाला केवल उन पंक्तियों की गणना करता है जहां all_names IS NOT NULL
. अगर आपका कॉलम all_names
. है NOT NULL
. के रूप में परिभाषित किया गया है , दोनों समान लौटाते हैं, लेकिन count(*)
थोड़ा छोटा और तेज़ है।
GROUP BY 1
के बारे में :
- ग्रुप बाय + केस स्टेटमेंट