On this case: select random(), random() from blah order by random()
? Error ambiguous column "random()" near "order by". Cheers ! ? > Thu Aug 27 2015 6:48:54 pm CEST CEST from "Scott Robison" ><scott at casaderobison.com> Subject: Re: [sqlite] order by not working in >combination with random() > > On Thu, Aug 27, 2015 at 10:06 AM, Jean-Christophe Deschamps < > jcd at antichoc.net> wrote: > > >>At 16:00 27/08/2015, you wrote: >> >> >>><quote> >>> An *ORDER BY* clause in SQL <https://en.wikipedia.org/wiki/SQL> specifies >>> that a SQL SELECT <https://en.wikipedia.org/wiki/Select_(SQL)> statement >>> returns a result set <https://en.wikipedia.org/wiki/Result_set> with the >>> rows being sorted by the values of one or more columns. The sort criteria >>> do not have to be included in the result set. The sort criteria can be >>> expressions, including ? but not limited to ? column names, >>>user-defined >>> functions <https://en.wikipedia.org/wiki/User_defined_function>, >>> arithmetic >>> operations, or CASE expressions. The expressions are evaluated and the >>> results are used for the sorting, i.e. the values stored in the column or >>> the results of the function call. >>> <quote> >>> >>> >> Pretty clear until now. >> >> So, applying this to our subject, "rr" is _NOT_ the name a column in the >> >>>table. >>> >>> >> Yes: it's a temporary schema name. >> >> > I can see both sides of this debate, whether or not random() should be > evaluated twice in this context: > > select random() from blah order by random() > > So let me pose a question. What should the following query generate? > > select random(), random() from blah order by random() > > Should all three random values be the same? Certainly I can see a case for > that, but it doesn't seem useful to me. What would be even worse is if it > behaved like other functions which maintain their value over an entire > select statement as DRH indicated recently. Do we really want a single > random number used three times per row for thousands of rows? I doubt it. > > Perhaps you think it should create two random values for the columns but > reuse one of them for the order by. But which? Sure, if the columns were > aliased with names one might expect it to pick the right one, but it seems > that is not a requirement of at least one interpretation of the standard. > > Ultimately it is a question of "what should happen with a function that has > side effects"? SQLite has a flag for user defined functions named > SQLITE_DETERMINISTIC. This flag allows the author of the function to inform > SQLite that the function will always return a single result for a given set > of input. I can only assume that the "native" functions of SQLite use > something very similar to this interface (where "using that exact > interface" is as similar as possible). > > Clearly random() cannot be deterministic as it takes no user supplied input > (even indirectly from a separate seed function) yet is expected to > (probably) return different numbers from each invocation that cannot be > predicted in advance. > > It seems that if someone needs a list of random values that can > subsequently be sorted (or selected or whatever) they need to resort to > temp tables or subqueries. One step to generate the random values, another > to process the now fixed set of random numbers. > > Alternatively, we need a third class of functions. NON_DETERMINISTIC, > DETERMINISTIC, and PSEUDO_DETERMINISTIC. I don't care for that solution. > > Realizing this is not a democracy, my vote if cast would be to keep the > existing functionality. It is not difficult to work around the > non-deterministic nature of the random function via temp tables or > subqueries. I dare say it is an extremely tiny subset of queries that will > ever have to worry about this. Update the documentation in some way to make > it clear random behaves this way (and perhaps that column aliases in an > order by clause re-evaluate their definitions from the select). But my vote > doesn't mean much, so whatever. > > Maybe the best answer to this issue is "to change the functionality at this > point may break existing queries that depend on the current behavior" and > thus it should not be changed. > > -- > Scott Robison > _______________________________________________ > sqlite-users mailing list > sqlite-users at mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users > > > ?