PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

दूसरी तालिका में संख्या के आधार पर एक तालिका में एकाधिक पंक्तियाँ सम्मिलित करें

मूल प्रश्न का उत्तर

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 के बारे में :

  • ग्रुप बाय + केस स्टेटमेंट



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. clojure.java.jdbc आलसी क्वेरी

  2. मैं postgresql फ़ंक्शन या ट्रिगर से कुछ http अनुरोध कैसे भेज सकता हूं?

  3. मुझे libpq स्रोत कहां मिलेगा?

  4. PostgreSQL में लेनदेन अलगाव

  5. IRI कार्यक्षेत्र में PostgreSQL से कनेक्ट करना