मेरे पास दो टेबल हैं, custassets
और tags
। कुछ टेस्ट डेटा जेनरेट करने के लिए मैं INSERT INTO
SELECT
के साथ कई से अधिक टेबल करना चाहता हूं जो प्रत्येक से यादृच्छिक पंक्तियां प्राप्त करता है (ताकि एक तालिका से यादृच्छिक प्राथमिक कुंजी दूसरे से यादृच्छिक प्राथमिक कुंजी के साथ जोड़ा जा सके) । मेरे आश्चर्य के लिए यह उतना आसान नहीं है जितना मैंने पहले सोचा था, इसलिए मैं खुद को सिखाने के लिए इसके साथ रह रहा हूं।मैं PostgreSQL में एक यादृच्छिक कार्टशियन उत्पाद कैसे प्राप्त कर सकता हूं?
मेरा पहला प्रयास यहां है। मैं 10 custassets
और 3 tags
का चयन करता हूं, लेकिन दोनों मामले में समान हैं। मैं ठीक होने वाली पहली तालिका के साथ ठीक हूं, लेकिन मैं असाइन किए गए टैग को यादृच्छिक बनाना चाहता हूं।
SELECT
custassets_rand.id custassets_id,
tags_rand.id tags_rand_id
FROM
(
SELECT id FROM custassets WHERE defunct = false ORDER BY RANDOM() LIMIT 10
) AS custassets_rand
,
(
SELECT id FROM tags WHERE defunct = false ORDER BY RANDOM() LIMIT 3
) AS tags_rand
यह पैदा करता है:
custassets_id | tags_rand_id
---------------+--------------
9849 | 3322 }
9849 | 4871 } this pattern of tag PKs is repeated
9849 | 5188 }
12145 | 3322
12145 | 4871
12145 | 5188
17837 | 3322
17837 | 4871
17837 | 5188
....
मैं तो निम्नलिखित दृष्टिकोण की कोशिश की: SELECT
स्तंभ सूची में दूसरे नंबर पर RANDOM()
कॉल कर। हालांकि यह एक और भी बदतर था, क्योंकि यह एक टैग पीके और इसके साथ चिपकता है।
SELECT
custassets_rand.id custassets_id,
(SELECT id FROM tags WHERE defunct = false ORDER BY RANDOM() LIMIT 1) tags_rand_id
FROM
(
SELECT id FROM custassets WHERE defunct = false ORDER BY RANDOM() LIMIT 30
) AS custassets_rand
परिणाम:
custassets_id | tags_rand_id
---------------+--------------
16694 | 1537
14204 | 1537
23823 | 1537
34799 | 1537
36388 | 1537
....
यह एक पटकथा भाषा में आसान होगा, और मुझे यकीन है कि एक संग्रहीत प्रक्रिया या अस्थायी तालिका के साथ काफी आसानी से किया जा सकता हूँ। लेकिन क्या मैं इसे INSERT INTO SELECT
के साथ कर सकता हूं?
मैंने यादृच्छिक फ़ंक्शन का उपयोग करके पूर्णांक प्राथमिक कुंजी चुनने के बारे में सोचा था, लेकिन दुर्भाग्य से दोनों तालिकाओं के लिए प्राथमिक कुंजी में वृद्धि अनुक्रमों में अंतर होता है (और इसलिए प्रत्येक तालिका में एक खाली पंक्ति चुनी जा सकती है)। यह अन्यथा ठीक होगा!
टिप्पणी करने वाले सभी लोगों के लिए धन्यवाद - अगर यह मेरे ऊपर था, तो मैं कई टिकों से सम्मानित होता! ':-)' – halfer