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?

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
>

Reply via email to