the behavior is a result of the fact that Oracle has no LIMIT/OFFSET capability, and SQLAlchemy attempts to approximate this behavior, using the recipe described at http://www.oracle.com/technology/oramag/oracle/06-sep/o56asktom.html .
So the subquerying is taking effect as a necessity of that backend, unless you want to add limit/offset to this query in a different way - since every other element of the query is textual I would advise just using a straight text() construct instead of a SELECT. Tiago Becker wrote: > I forgot, in the Ctrl+c and ctrl+v, to add that the problem only happens > when using limit and offset with oracle dialect (sorry about that).. > > so > > > self.fields = ' case field1 > when 34 then field2 > when 94 then field3 > when 48 then field4 > end another_field' > > self.from = ' table ' > > self.where = ' 1 = ' //nevermind this > > sql = select(columns=[self.fields], from_obj=self.tables, > whereclause=self.where, bind=self.engine, order_by= ' 1 > ').limit(1).offset(30) > > result: > > select > case field1 > when 34 then field2 > when 94 then field3 > when 48 then field4 > end another_field > from > (select > case field1 > when 34 then field2 > when 94 then field3 > when 48 then field4 > end another_field, > ROW_NUMBER() OVER (ORDER BY 1 ) AS ora_rn > from > table > where > 1 = 1) > WHERE ora_rn>1 AND ora_rn<=30 > > > > > sorry about the mess, > > On Tue, May 19, 2009 at 2:21 PM, Michael Bayer > <mike...@zzzcomputing.com>wrote: > >> send along full reproducing test cases and that will reveal all. >> >> On May 19, 2009, at 11:36 AM, Tiago Becker wrote: >> >> "this indicates a None is being sent as a column somewhere." >> >> I'm just not passing the order_by clause... >> >> "I dont see the SQLAlchemy expression you're dealing with here. the >> symptom you describe is when placing a FROM object in the columns >> clause of a SELECT, the object is also added to the FROM clause >> automatically, unless additional steps are taken to prevent this. A >> CASE statement is not is not a FROM object, its a column object, so >> this should not occur. If you are placing a SELECT in the columns >> clause of another SELECT, call as_scalar() on it." >> >> hmm, something strange here, as i'm not passing a from object in the >> columns... >> >> im doing this: >> >> self.fields = ' case field1 >> when 34 then field2 >> when 94 then field3 >> when 48 then field4 >> end another_field' >> >> self.from = ' table ' >> >> self.where = ' 1 = ' //nevermind this >> >> then: >> >> sql = select(columns=[self.fields], from_obj=self.tables, >> whereclause=self.where, bind=self.engine, order_by= ' 1 ') >> >> results in >> >> select >> case field1 >> when 34 then field2 // this is the problem... in the inner >> select (the FROM select), field2 is not selected, so it does not exists >> when 94 then field3 >> when 48 then field4 >> end another_field >> from >> (select >> case field1 >> when 34 then field2 >> when 94 then field3 >> when 48 then field4 >> end another_field >> from >> table >> where >> 1 = 1) >> >> this is can be fixed by replacing the fields in the outer join by adding >> *, >> as it will select all the fields in the query... >> >> How do i solve this? >> >> On Tue, May 19, 2009 at 12:13 PM, Michael Bayer >> <mike...@zzzcomputing.com>wrote: >> >>> >>> >>> On May 19, 2009, at 10:39 AM, Tiago Becker wrote: >>> >>> > Hi. >>> > >>> > Im still trying to use the select object from sqlalchemy, but i >>> > found a strange (bug or not) behavior: >>> > >>> > sql = select(columns=[self.fields], from_obj=self.tables, >>> > whereclause=self.where, bind=self.req.cfg.engine, order_by= ' 1 ') >>> > >>> > 1) without order by, i get an error: AttributeError: 'NoneType' >>> > object has no attribute 'proxies'. is this intended? >>> >>> this indicates a None is being sent as a column somewhere. >>> >>> > 2) the select fails when theres a CASE instruction, like this: >>> > >>> > case field1 >>> > when 34 then field2 >>> > when 94 then field3 >>> > when 48 then field4 >>> > end another_field >>> > >>> > It fails because sqlalchemy does a subquery, but instead of using * >>> > (in the outer query, to bring all the fields) it just paste the same >>> > fields from the original query, failing to get all the fields in the >>> > case expression.... >>> >>> I dont see the SQLAlchemy expression you're dealing with here. the >>> symptom you describe is when placing a FROM object in the columns >>> clause of a SELECT, the object is also added to the FROM clause >>> automatically, unless additional steps are taken to prevent this. A >>> CASE statement is not is not a FROM object, its a column object, so >>> this should not occur. If you are placing a SELECT in the columns >>> clause of another SELECT, call as_scalar() on it. >>> >>> >>> >> >> >> >> >> >> > >> > > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---