On 2015-07-31 06:22 PM, Gabor Grothendieck wrote:
> Both the solutions transformed the correlated subquery into a join prior to
> forming the CTE.  Can we conclude, in general, that CTEs do not support
> correlated subqueries?

Slow down please! - Your example did work and did get the correct result 
using a sub-query AND a CTE. There is no problem with that.

I've simply shown a way to use the "A.avgSalary" notation which you 
mentioned would be nice to have, together with a slight optimization 
(which I saw mimicked the way John suggested - obviously, he too, moved 
to optimize) - but none of those examples mean that sub-queries CANNOT 
exist in (or with) CTE's. It simply means that in this specific query, 
the CTE is better than the sub-query.

Also, the join is formed with the CTE, I am not sure why you use the 
words "prior to forming the CTE".

I hope that is more clear...
Cheers!
Ryan


>
> On Fri, Jul 31, 2015 at 11:30 AM, R.Smith <rsmith at rsweb.co.za> wrote:
>
>>
>> On 2015-07-31 03:40 PM, Gabor Grothendieck wrote:
>>
>>> On Fri, Jul 31, 2015 at 8:40 AM, Simon Slavin <slavins at bigfraud.org>
>>> wrote:
>>>
>>> I am noting an overlap with the things SQLite users have been using
>>>> sub-SELECTs for.
>>>>
>>>>
>>>> Here is a self contained example that can be fed into the sqlite3 command
>>> line tool.  It uses WITH to factor out the subquery; however, the annoying
>>> part about it is that even though we have factored out the subquery we
>>> still have to include a simplified version of the subquery, viz.
>>>     (select avgSalary from A)
>>> It would have been nice if we could just replace (select avgSalary from A)
>>> with (A.avgSalary) or even (A) but those substitutions do not work:
>>>
>> Well, you can, sort-of, if you use the CTE column naming. Consider this
>> simplified version of your Query (also using the CTE to do the actual
>> aggregate work once only):
>>
>>     create table Emp (emp text, salary real, dept text);
>>     insert into Emp values
>>     ('a', 1, 'A'),
>>     ('b', 2, 'A'),
>>     ('c', 3, 'A'),
>>     ('d', 1, 'B'),
>>     ('e', 2, 'B'),
>>     ('f', 3, 'B');
>>
>>
>>     WITH A(dept,avgSalary) as (
>>          SELECT Emp.dept, AVG(salary) FROM Emp GROUP BY Emp.dept
>>     )
>>     SELECT Emp.*
>>        FROM Emp, A
>>       WHERE Emp.dept = A.dept AND Emp.salary > A.avgSalary;
>>
>>
>>        --  emp  | salary |  dept
>>        -- ----- | ------ | -----
>>        --   c   |   3.0  |   A
>>        --   f   |   3.0  |   B
>>
>>
>> -- based on query at: https://en.wikipedia.org/wiki/Correlated_subquery
>>> create table Emp (emp text, salary real, dept text);
>>> insert into Emp values ('a', 1, 'A');
>>> insert into Emp values ('b', 2, 'A');
>>> insert into Emp values ('c', 3, 'A');
>>> insert into Emp values ('d', 1, 'B');
>>> insert into Emp values ('e', 2, 'B');
>>> insert into Emp values ('f', 3, 'B');
>>> WITH A as
>>>    (SELECT AVG(salary) AS avgSalary FROM Emp WHERE dept = e1.dept)
>>>    SELECT *
>>>    FROM Emp AS e1
>>>    WHERE salary > (select avgSalary from A);
>>>
>>> Here is a sample run assuming the above has been placed into a file named
>>> test.sqlite.
>>>
>>> C:\> sqlite3 < test.sqlite
>>> c|3.0|A
>>> f|3.0|B
>>>
>>> (I am using sqlite 3.8.3 on Windows 8.1.)
>>> _______________________________________________
>>> sqlite-users mailing list
>>> sqlite-users at mailinglists.sqlite.org
>>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>>>
>> _______________________________________________
>> sqlite-users mailing list
>> sqlite-users at mailinglists.sqlite.org
>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to