I am trying to figure out how to implement a correlated subquery with ORM.
One of the complexities is that the query has a table that correlates to
itself and I can't figure out how to do that aliasing within ORM queries.

In a recent thread,
http://groups.google.com/group/sqlalchemy/browse_thread/thread/c010ac1f326dbb2b
Richie Ward asked about using subquery to find max item within a group of
items

Given this class

class Content(Base):
    __tablename__ = 'content'
    revision_id = Column(Integer, primary_key=True)
    modulename = Column(Unicode(256))
    content = Column(Unicode(102400), default='')
    summary = Column(Unicode(256))
    created = Column(DateTime, default=datetime.now)

for each modulename, select the the object with highest revision_id and
non-blank content
and the solution was something like this

revision_ids = session.query(func.max(Content.revision_id)).\
    filter(Content.content != '').group_by(Content.modulename).subquery()
pages = session.query(Content.modulename, Content.revision_id,
Content.content).\

filter(Content.revision_id.in_(revision_ids)).order_by(Content.modulename)

The generated SQL (somewhat cleaned up for readability) is

SELECT   c1.modulename, c1.revision_id, c1.content
FROM     content c1
WHERE    c1.revision_id IN
            (SELECT MAX(c2.revision_id)
             FROM   content c2
             WHERE  c2.content != ''
             GROUP BY c2.modulename)
ORDER BY c1.modulename


In a very large database with a more complex query and depending on the
underlying database engine, a correlated subquery will likely perform
better, so I want to build this SQL using ORM syntax.

SELECT   c1.modulename, c1.revision_id, c1.content
FROM     content c1
WHERE    c1.revision_id =
            (SELECT MAX(c2.revision_id)
             FROM   content c2
             WHERE  c2.modulename = c1.modulename
               AND  c2.content != '')
ORDER BY c1.modulename

How do we do that? None of my attempts manage to get the subquery where
clause to include the correlation c2.modulename = c1.modulename.
Maybe need to use alias somehow?


-- 
Mike Conley

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to