मेरे पास टेबल बी & सी तालिका कुंजी के माध्यम से तालिका ए के साथ 3 टेबल हैं। मैं PostgreSQL में एक प्रश्न लिखने के लिए बी & से एक से और साथ ही उनका कुल घटनाओं सभी आईडी प्राप्त करने के लिए सी चाहतेएकाधिक तालिकाओं से विदेशी कुंजी की गिनती प्राप्त करें
a | b | c
-----------------------------------
id | txt | id | a_id | id | a_id
---+---- | ---+----- | ---+------
1 | a | 1 | 1 | 1 | 3
2 | b | 2 | 1 | 2 | 4
3 | c | 3 | 3 | 3 | 4
4 | d | 4 | 4 | 4 | 4
आउटपुट (बी & सी में एक & कुल संख्या से सिर्फ आईडी) वांछित:
id | Count
---+-------
1 | 2 -- twice in B
2 | 0 -- occurs nowhere
3 | 2 -- once in B & once in C
4 | 4 -- once in B & thrice in C
एसक्यूएल अब तक SQL Fiddle:
SELECT a_id, COUNT(a_id)
FROM
(SELECT a_id FROM b
UNION ALL
SELECT a_id FROM c
) AS union_table
GROUP BY a_id
क्वेरी मैंने लिखा बीसे हासिल करेगासी और घटनाओं की गणना करता है। लेकिन यदि कुंजी बी या सी में नहीं होती है, तो यह आउटपुट में दिखाई नहीं देती है (उदाहरण के लिए आउटपुट में आईडी = 2)। मैं मेज से मेरा चयन कैसे शुरू कर सकते हैं एक & में शामिल होने/संघ बी & सी वांछित आउटपुट
आप क्यों कहते हैं कि आपका दूसरा विकल्प शायद धीमा है? इसमें कम जॉइन हैं, क्या यह तेज़ नहीं होना चाहिए? – click
@click मैं PostgreSQL (इससे दूर) के साथ एक विशेषज्ञ नहीं हूं, लेकिन शायद 'ग्रुप बाय' जैसे कुल फ़ंक्शन का उपयोग करना धीमा हो जाएगा। लेकिन इसके बारे में बेहतर सोचते हुए, मुझे वास्तव में यह नहीं पता कि इरविन की पहली क्वेरी मेरे उत्तर से तेज क्यों होनी चाहिए (मेरा मानना है कि दोनों ओरेकल और एसक्यूएल सर्वर जैसे डेटाबेस में समान निष्पादन योजनाएं होंगी), लेकिन मुझे लगता है * वह जानता है कि वह क्या जानता है के बारे में बात कर रहा है – rsenna
@click: जुड़ने की संख्या कई कारकों में से एक है। यह सब कार्डिनिटीज और डेटा वितरण (दूसरों के बीच) पर निर्भर करता है। यही कारण है कि मैं ठेठ मामलों और संभावनाओं के बारे में बात करता हूं। निश्चित रूप से जानने के लिए आपको अपने * वास्तविक * परिदृश्य से परीक्षण करना होगा। पहली क्वेरी आमतौर पर सादगी और प्रभावशीलता के बीच एक मीठा स्थान हिट करती है। –