Folks,
One response to my post on Stack Overflow, but no solution, so I'll post 
it here. (Recurse.sql).
Studied documentation without being able to de-optimize SET from single 
Scalar evaluation.
Regards, Brian Burleigh
-------------- next part --------------
// In which we investigate recursive update
.mode list
SELECT 'Create and populate tables of detail and to hold aggregate';
DROP TABLE IF EXISTS temp.detail;
DROP TABLE IF EXISTS temp.average;
CREATE TEMP TABLE detail  (rowid INTEGER PRIMARY Key AUTOINCREMENT, 
   grp INTEGER,atom FLOAT);
INSERT INTO detail (grp,atom) VALUES (2,2);
INSERT INTO detail (grp,atom) VALUES (2,4);
INSERT INTO detail (grp,atom) VALUES (1,3);
INSERT INTO detail (grp,atom) VALUES (1,5);
INSERT INTO detail (grp,atom) VALUES (3,1);
INSERT INTO detail (grp,atom) VALUES (3,3);
SELECT * FROM detail;
CREATE TEMP TABLE average (rowid INTEGER PRIMARY KEY AUTOINCREMENT, avrg FLOAT);
INSERT INTO average (avrg) VALUES (1.0);
INSERT INTO average (avrg) VALUES (1.0);
INSERT INTO average (avrg) VALUES (1.0);
.mode column average
.mode column detail
.header on
.width 7
SELECT avrg as Average FROM average;
SELECT 'SELECT produces three rows';
with recursive loop(bid) as (Values(1) union all
    select bid + 1 from loop LIMIT 3)
    SELECT AVG(atom) AS Average  from detail 
    where grp IN loop GROUP BY grp;
SELECT 'Within SET clause, SELECT produces one scalar result';
with recursive loop(bid) as (Values(1) union all
    select bid + 1 from loop LIMIT 3)
    UPDATE average SET avrg =
    (SELECT AVG(atom) from detail
    WHERE grp IN loop GROUP BY grp HAVING grp IN loop)
    where rowid IN loop;
SELECT 'Single SET result populates all target rows';
SELECT avrg AS Average from average;
--  End of the example code
-- But Insert works beautifully
DROP TABLE average;
CREATE TEMP TABLE average (rowid INTEGER PRIMARY KEY AUTOINCREMENT, avrg FLOAT);
INSERT INTO average (avrg) 
    with recursive loop(grp) as (Values(1) union all
    select grp + 1 from loop LIMIT 3)
    SELECT AVG(atom) from detail NATURAL JOIN loop
    GROUP BY grp;
SELECT avrg AS Average FROM average;
    -- Nested recursion attempt   Recursive aggregate queries not supported
WITH RECURSIVE loop(grp,avg) AS (SELECT 0,1 UNION ALL
    SELECT loop.grp+1,AVG(atom)  FROM detail,loop 
    GROUP BY loop.grp HAVING detail.grp = loop.grp)
    UPDATE average SET avrg = loop.avg
    where rowid  IN loop.grp;
SELECT avrg AS Average FROM average;
with recursive loop(grp) as (Values(1) union all
    select grp + 1 from loop LIMIT 3)
    UPDATE average SET avrg =
    (SELECT AVG(atom) from detail NATURAL JOIN loop 
    GROUP BY loop.grp HAVING detail.grp IN loop)
    where rowid IN loop;
SELECT avrg AS Average FROM average;

Reply via email to