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