I think this was not the case, since I didn't expect the merged result
to be ordered.

To be more precise, the query looks like:
q1 = Thing.query().filter(...).order_by(Thing.a.desc()).limit(1)
q2 = Thing.query().filter(...).order_by(Thing.a.asc()).limit(1)
q = q1.union(q2).order_by(Thing.id).all()

The q1 returns first filtered element with largest 'a' column, q2 -
first with smallest 'a'.

So, I guess my question is still valid.

On 6 Bir, 17:49, Adrian von Bidder <avbid...@fortytwo.ch> wrote:
> On Saturday 06 June 2009 14.18:33 naktinis wrote:
>
> > I want to use union on two queries, which have different order:
> > q1 = Thing.query().order_by(Thing.a)
> > q2 = Thing.query().order_by(Thing.b)
> > q = q1.union(q2).all()
>
> SQL doesn't work as you think it does here.
>
> A UNION does not concatenate the results of the two queries, but is allowed
> to return the result in any order.  ORDER BY can *then* be applied to the
> end result of your union.  So even if you use subqueries, the order by in
> the subqueries might just be ignored.
>
> This is to allow the SQL query planner to be clever while building the union
> (perhaps a large union over two queries over the same table: if both queries
> require a table scan over the large table, the planner might decide to build
> the union by scanning the table only once while running both queries in
> parallel, so the table is loaded from disk once insead of twice.  The UNION
> would then contain the resulting rows in more or less random order.)
>
> But I digress.
>
> What you want to do is something like:
>
> SELECT 1 as COL1, ... FROM ...
> UNION
> SELECT 2 as COL1, ... FROM ...
> ORDER BY COL1, ...
>
> cheers
> -- vbi
>
> > But after this query I get MySQL error message "Incorrect usage of
> > UNION and ORDER BY".
>
> > I guess that this could be because having "SELECT ... UNION SELECT ...
> > ORDER BY B", it is not clear whether the second subquery or both
> > queries should be ordered using B criteria. I think this can be solved
> > by adding brackets to each of the subquery: "(SELECT ...) UNION
> > (SELECT ...)".
>
> > Is there any way to create this query using SQLAlchemy ORM?
>
> > I am using SQLAlchemy 0.5.4.
>
> --
> Vertrauen ist gut.  Anwalt ist saugeil.
--~--~---------~--~----~------------~-------~--~----~
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