2012-04-18 16 views
9

मैं कुछ तालिकाओं जो मूल रूप से कुछ ऐसा नज़र है:एक भी समूह समूह समारोह

TBL_USER 
user_id - number 
user_name - varchar 

TBL_STUFF 
stuff_id - number 
stuff_user_id - number 

मैं "सामान" के उनके पास संख्या सहित सभी उपयोगकर्ता जानकारी के लिए क्वेरी करना चाहते हैं। मैं कुछ इस तरह कोशिश कर रहा था:

select user_id, user_name, count(stuff_id) 
    from tbl_user 
    left outer join tbl_stuff on stuff_user_id = user_id 
where user_id = 5; 

लेकिन मुझे एक त्रुटि का कहना है जो "नहीं एक एकल समूह समूह समारोह"

वहाँ किसी और तरीके से मैं यह कर किया जाना चाहिए है मिल सकता है?

उत्तर

7

आप इसे इस तरह भी कर सकता है:

select 
    user_id, 
    user_name, 
    (
    SELECT 
     COUNT(*) 
    FROM 
     tbl_stuff 
    WHERE 
     stuff_user_id = tbl_user.user_id 

) AS StuffCount, 
from 
    tbl_user 
where 
    user_id = 5; 
8

ठीक है, आप समूह समारोह ;-)

याद कर रहे हैं इसे आज़माएं:

select user_id, user_name, count(stuff_id) 
from tbl_user left outer join tbl_stuff on stuff_user_id = user_id 
where user_id = 5 
group by user_id, user_name; 

अंतिम पंक्ति group by खंड है कि ओरेकल बताता है एक ही user_id और user_name संयोजन के साथ सभी पंक्तियों की गणना करना, ।

+0

मैं इस +1 अगर देना चाहते हैं यह निहित के बजाए टेबल नामों के साथ भी स्पष्ट था;) – MatBailie

+0

यहां स्पष्ट तालिका नामों की आवश्यकता नहीं है। –

+0

मैंने "user_id द्वारा समूह" जोड़ने का प्रयास किया लेकिन मुझे संदेश "अभिव्यक्ति द्वारा समूह नहीं" मिला। क्या मुझे वास्तव में सभी क्षेत्रों को जोड़ने की ज़रूरत है, मेरी असली पूछताछ में ऐसे कई अन्य फ़ील्ड हैं जिन्हें मैं चुन रहा हूं। –

1

अपनी टिप्पणी कहा गया है कि आप सभी क्षेत्र एक GROUP BY खंड में मौजूद शामिल करने के लिए नहीं करना चाहते हैं में से एक।

@ एरियन ने एक सहसंबंधित उप-क्वेरी पुनः-कारक पोस्ट किया जो समान मान देता है।

निम्न क्वेरी मानक (गैर-सहसंबंधित) उप-क्वेरी (इनलाइन-व्यू) इसके बजाय उपयोग करती है। ऐसा इसलिए है क्योंकि इस इनलाइन-व्यू संरचना अक्सर सहसंबंधित-उप-क्वेरी समकक्ष निष्पादित कर सकते हैं। लेकिन, यह भी, क्योंकि मुझे उन्हें बनाए रखने में आसान लगता है।

WITH 
    stuff_count 
AS 
(
    SELECT 
    stuff_user_id AS user_id, 
    COUNT(*)  AS val 
    FROM 
    tbl_stuff 
    GROUP BY 
    stuff_user_id 
) 
SELECT 
    tbl_user.user_id, 
    tbl_user.user_name, 
    stuff_count.val 
FROM 
    tbl_user 
LEFT JOIN 
    stuff_count 
    ON stuff_count.user_id = tbl_user.user_id 
WHERE 
    tbl_user.user_id = 5; 

नोट: जब योजना उत्पन्न होता है, यह केवल user_id के आवश्यक हो, नहीं पूरे तालिका के लिए उप क्वेरी चलाता है;)

संबंधित मुद्दे