On Sun, Sep 6, 2015 at 10:54 AM, E.Pasma <pasma10 at concepts.nl> wrote:

>
> Op 6 sep 2015, om 16:44 heeft Scott Robison het volgende geschreven:
>
>>
>> One, the argument wasn't whether or not column expressions were called
>> multiple times. My understanding of the debate was that using aliases in
>> place of their definitions made code more understandable and more easily
>> maintained than gratuitous repetition of the definitions.
>>
>> Two, you used a different query. Looking at my query again (fleshed out
>> since I'm on a computer vs my phone):
>>
>> sqlite> create table c(a);
>> sqlite> insert into c values(1);
>> sqlite> insert into c values(2);
>> sqlite> insert into c values(3);
>> sqlite> insert into c values(4);
>> sqlite> select * from (select a as b from c) where b > 2;
>> 3
>> 4
>> sqlite> explain query plan select * from (select a as b from c) where b >
>> 2;
>> 0|0|0|SCAN TABLE c
>>
>> sqlite> select * from (select abs(a-a-a) as b from c) where b > 2;
>> 3
>> 4
>> sqlite> explain query plan select * from (select abs(a-a-a) as b from c)
>> where b > 2;
>> 0|0|0|SCAN TABLE c
>>
>> Clearly, this gives you an opportunity to replace definitions with
>> aliases,
>> since the aliases in the inner query become the column names of the outer
>> query.
>>
>> Your example doesn't do the same thing at all (ignoring the difference
>> between your condition of > 0 and mine of > 2). Your query is made of
>> scalar subqueries and you will never get more than a single row back.
>>
>> The following two queries are not the same:
>>
>> select 1 from (select (select a from c) as b) where b > 0;
>>
>> select 1 from (select a as b from c) where b > 0;
>>
>> In any case, this is a perfectly good option to query building that don't
>> require non-standard behavior (as far as I can tell) while still giving
>> the
>> benefit of DRY (don't repeat yourself) as someone noted previously. It's
>> more verbose. It may not be as intuitive. But it works.
>>
>> I am not a SQL guru. If I am wrong about my alternative invoking only
>> standard behavior, my apologies.
>>
>>
> Yes. the debate is about column aliases.
> Still the OP also wished to not call column expressions multiple times.
> And I had to change your query to make that appear in the query plan.
> But here is an example very close to yours where b is an alias for
> random().
> I changed thea original where clause (b>2) to b <> b abd I hope it is
> obvious
> that the function is caled multiple times for each row.
>
> create table c(a);
> insert into c values(1);
> insert into c values(2);
> insert into c values(3);
> insert into c values(4);
> select * from (select random() as b from c) where b <> b;
> 232218896271007264
> -1043354911054439855
> 5116834959932449572
> 7115658816317887453
>

Interesting query. So it would seem then that a temp table would be
required for something like this to avoid calling random three times per
row. I would have expected *this* version to return no rows. I guess this
is why we test software. :)


-- 
Scott Robison

Reply via email to