Thank you very much for your effort in putting together a complete and
working example.

Much appreciated,

Thijs

On Sat, Apr 6, 2013, at 18:10, Audrius Kažukauskas wrote:
> Hi, Thijs,
> 
> On Thu, 2013-04-04 at 21:36:56 +0200, Thijs Engels wrote:
> > Assume a database with two tables; sessions and events. Sessions has a
> > primary key id and some additional information. Events has a primary key
> > which consists of session_id (foreign key to Sessions) and event_id
> > which is using a sequence. This table contains an additional column
> > which contains the value I am interested in.
> > 
> > SESSIONS
> > - SESSION_ID [PK]
> > - DATE
> > 
> > EVENTS
> > - SESSION_ID [PK + FK]
> > - EVENT_ID [PK]
> > - CODE
> > 
> > Each session has multiple events, what I am interested in is the code of
> > the last event per session (event with highest event id).
> > 
> > I managed to come up with the SQL which will do this:
> > 
> > SELECT
> >   SSN.SESSION_ID,
> >   SSN.DATE
> > FROM
> >   SESSIONS SSN
> > LEFT JOIN
> >   (SELECT
> >     EVT.SESSION_ID,
> >     EVT.CODE
> >   FROM
> >     EVENTS EVT
> >   INNER JOIN
> >     (SELECT
> >       SESSION_ID,
> >       MAX(EVENT_ID) AS EVENT_ID
> >     FROM
> >       EVENTS
> >     GROUP BY
> >       SESSION_ID) LAST_EVENT
> >   ON
> >     AEL.SESSION_ID = LAST_EVENT.SESSION_ID AND
> >     AEL.EVENT_ID = LAST_EVENT.EVENT_ID) EVENT
> > ON
> >   EVENT.SESSION_ID = SSN.SESSION_ID
> > ORDER BY
> >   SSN.SESSION_ID;
> > 
> > Hence initially getting the max event_id, which is then joined with the
> > events table to extract the code, which in the end is join with the
> > sessions table.
> > 
> > I tried to transform this query to SQLAlchemy, but am getting stuck.
> > Looking at the various examples as found in the documentation I gathered
> > that I should start with the creation of a sub-query:
> > 
> > stmt = oracle.query(Event.session_id,
> > func.max(Event.id).label("last_event")).group_by(Event.session_id).subquery()
> > 
> > But I can not figure out how to use this sub-query in the two remaining
> > joins...
> 
> You were on correct path, what you're missing is the fact that result of
> .subquery() is an object which can be used like a Table in another
> query.  So to access last_event in your stmt subquery, you would write
> it like this:
> 
>   stmt.c.last_event
> 
> Following is the declaration of two tables (using declarative extension)
> and your full query:
> 
>   class Session(Base):
>       __tablename__ = 'sessions'
>       session_id = Column(Integer, primary_key=True)
>       date = Column(DateTime())
> 
>   class Event(Base):
>       __tablename__ = 'events'
>       session_id = Column(Integer, ForeignKey('sessions.session_id'),
>                           primary_key=True)
>       event_id = Column(Integer, primary_key=True)
>       code = Column(Integer)
> 
>   last_event = db_session.query(
>       Event.session_id,
>       func.max(Event.event_id).label('event_id')
>   ).group_by(Event.session_id).subquery()
>   event = db_session.query(
>       Event.session_id,
>       Event.code
>   ).join(last_event, and_(
>       Event.session_id == last_event.c.session_id,
>       Event.event_id == last_event.c.event_id
>   )).subquery()
>   q = db_session.query(
>       Session,
>       event.c.code
>   ).outerjoin(event).order_by(Session.session_id)
> 
> -- 
> Audrius Kažukauskas
> http://neutrino.lt/
> Email had 1 attachment:
> + Attachment2
>   1k (application/pgp-signature)

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to