On Mon, Dec 29, 2008 at 8:45 AM, Michael Bayer <mike...@zzzcomputing.com> wrote: > dkp_pool is not in the outer FROM list because you've set the FROM > clause of the outer query to series of joins which do not include that > table. From where would you like the max() function to pull its > column ? > > I also dont understand the relationship the various select() > constructs you've posted have with your mappings, if this is all > within the relation(), etc. > > A general comment here is that the select() constructs you're building > are way too complex to be useful, and even if they did work they're > going to run like sludge with all those joins. Can you post the > exact SQL statement you'd like to be issued ? Note that the > eagerloading mechanism can be combined with any specific SQL statement > you'd like, without relying upon SQLA to attempt its own > construction. This is described in > http://www.sqlalchemy.org/docs/05/mappers.html#routing-explicit-joins-statements-into-eagerly-loaded-collections > and if you do in fact require a query of that magnitude of > complexity to be used as an eager load, this might be the better way > to go.
I suppose I got a bit too wound up in trying to map a set of object relations and get it all in one query. How it basically works is this: For each pool in a guild, get the last run in that pool. A run is related to a pool by being associated with events in that pool. For each such last run, grab all the calculations associated with that run. So. I'll just split up the queries - not that big a deal. There's another query, however, which works like this: For each character in the guild, get the last run that character attended. Attendance is defined as having an attendance record for that run. It looks a lot like the queries I listed above. I ended up stuffing the query in a view, which works fine, but I'd rather not do that. So, if you have the time, you mention that I... > set the FROM clause of the outer query to series of joins which do not > include that > table. From where would you like the max() function to pull its > column run2pool = select([ run_table.c.id.label("run_id"), func.max(pool_table.c.id, type_=Integer).label("pool_id") ], from_obj = run_table.join(run_events_table).join(event_table).join(pool_table), group_by = [run_table.c.id]) run2pool_a = run2pool.correlate(None).alias('_run2pool') I see run_table and pool_table in the FROM list last_run_date_by_pool = \ select([ run2pool_a.c.pool_id.label("last_run_date_by_pool__pool_id"), func.max(run_table.c.date).label("last_run_date_by_pool__run_date"), ], from_obj = run2pool_a.\ join(run_table, run_table.c.id == run2pool_a.c.run_id), group_by = [ run2pool_a.c.pool_id ]) last_run_date_by_pool_a = last_run_date_by_pool.correlate(None).alias('_last_run_date_by_pool') I see run2pool and run_table in the FROM list last_run_by_pool = \ select([ pool_table.c.id.label("pool_id"), run_table, ], from_obj = pool_table.\ outerjoin(last_run_date_by_pool_a last_run_date_by_pool_a.c.last_run_date_by_pool__pool_id == pool_table.c.id).\ outerjoin(run_table, and_(pool_table.c.guild_id == run_table.c.guild_id, last_run_date_by_pool_a.c.last_run_date_by_pool__run_date == run_table.c.date))) last_run_by_pool_a = last_run_by_pool.alias('_last_run_by_pool') I see pool_table and run_table in the FROM list. My apologies, but I don't see what you're saying. I'm a bit confused how pool_table in the run2pool_a subquery is being turned into a subquery as well when there's an eagerload. Thanks again, Alan --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---