2011-09-02 17 views
5

में SQLAlchemy बंद करें मैंने कई विषयों की खोज की है और जवाब नहीं मिला है, या सवाल बहुत जटिल था। तो ठीक है। यह मेरा पहला सवाल है। यहाँ एसक्यूएलसबक्लेरी

SELECT parent.*, 
(
    SELECT COUNT(*) 
    FROM child 
    WHERE parent.id = child.parent_id 
) 
FROM parent 

कैसे SQLAlchemy में इस खंड करने के लिए है?

WHERE ui.invited_by = u.id 

क्या इसे संग्रह में पुन: उत्पन्न किया जा सकता है? एसक्यूएल अभिव्यक्तियाँ? पीएस मुझे पता है कि यह group_by द्वारा किया जा सकता है। लेकिन मुझे subquery की जरूरत है।

धन्यवाद।

+0

आपको एक सबक्वायरी क्यों चाहिए? – SingleNegationElimination

+1

यह एक अच्छा सवाल है। मुझे सभी टेबल (2 मिलियन पंक्तियों) में कुछ समेकन की आवश्यकता है। अगर मैं अपने समूह से 'समूह' की कोशिश कर रहा हूं तो टेम्पोररी टेबल बनाना शुरू कर देता हूं। यह पंक्तियों को प्राप्त करना शुरू करने से कुछ घंटे पहले कर सकता है। यदि आप थोक चाहते हैं तो आप आमतौर पर समूहबद्ध क्वेरी फ़िल्टर कर सकते हैं। तो मुझे बस आईडी मिल रही है और दो एकत्रीकरण के साथ चयन करते हैं। और अगर मैं सर्वर साइड कर्सर के माध्यम से पंक्तियां लाता हूं तो यह केवल 5 मिनट चलता है। – enomad

उत्तर

1

मुझे यहां वाकई शानदार जवाब मिल गया है। लेकिन यह भी बहुत जटिल है। सबसे पहले मैं यह बताना चाहता हूं कि एसक्यूएल दुनिया में बंद होना भ्रष्टाचार है।

यह वही नहीं है लेकिन मेरी मदद करता है।

pparent = Parent.__table__.alias('pparent') # using table directly to alias. 

subquery = s.query(count(Child.id)).join(pparent) # usual thing but use aliased table. 

s.query(Parent, subquery.filter(Parent.id == pparent.id).correlate(Parent).as_scalar()) #magic 
1

एसए क्वेरी (सबक्वेरी उपयोग करते हुए) आप इच्छित परिणाम दे देंगे:

SELECT  parent.*, 
      anon_1.child_num AS anon_1_child_num 
FROM  parent 
LEFT JOIN (SELECT child.parent_id AS parent_id, 
        count(child.id) AS child_num 
      FROM child 
      GROUP BY child.parent_id 
      ) AS anon_1 
     ON parent.id = anon_1.parent_id 

फिर भी कार्य करें:

sq = session.query(Child.parent_id, func.count(Child.id).label("child_num")).group_by(Child.parent_id) 
sq = sq.subquery() 
# use outerjoin to have also those Parents with 0 (zero) children 
q = session.query(Parent, sq.c.child_num).outerjoin(sq) 
q = q.filter(Parent.id == 1) # add your filter here: ui.invited_by = u.id 
for x in q.all(): 
    print x 

हालांकि सबक्वेरी की तरह कुछ के रूप में आप वर्णित बिल्कुल नहीं है, बल्कि समझ में नहीं आता है कि आपको यद्यपि वर्णित तरीके से उप-क्वेरी की आवश्यकता क्यों है।