Don V Nielsen <donvniel...@gmail.com> wrote: > I need help with a complex UPDATE. I want to update each row in a table, > calculating an average, and then apply that value back into a column of the > same row. Is this possible with Sqlite? Below is code that should work > with SqlServer; its UPDATE supports a FROM statement. > > UPDATE m SET rtwgt = avgrowid > FROM seg_02_matches as m > JOIN ( > SELECT pr3.zip, pr3.crrt, avg(ap.[rowid]) AS avgrowid > FROM ( > SELECT pr1.zip, pr1.crrt, pr1.prty, 'WI' AS 'id' FROM pool_WI AS pr1 > UNION > SELECT pr2.zip, pr2.crrt, pr2.prty, 'NY' AS 'id' FROM pool_NY AS pr2 > ) AS pr3 > INNER JOIN add_priorities AS ap ON ap.prty = pr3.prty AND ap.poolid = > pr3.id > GROUP BY pr3.zip, pr3.crrt > ) as sub ON m.zip = sub.zip AND m.route = sub.crrt
UPDATE seg_02_matches SET rtwgt = ( SELECT avg(ap.rowid) FROM ( SELECT zip, crrt, prty, 'WI' AS id FROM pool_WI AS pr1 UNION ALL SELECT zip, crrt, prty, 'NY' AS id FROM pool_NY AS pr2 ) AS pr3 JOIN add_priorities AS ap ON ap.prty = pr3.prty AND ap.poolid = pr3.id WHERE seg_02_matches.zip = pr3.zip AND seg_02_matches.route = pr3.crrt ); Might work faster if WHERE clause were duplicated inside the subselect. Try it both ways: UPDATE seg_02_matches SET rtwgt = ( SELECT avg(ap.rowid) FROM ( SELECT prty, 'WI' AS id FROM pool_WI AS pr1 WHERE seg_02_matches.zip = pr1.zip AND seg_02_matches.route = pr1.crrt UNION ALL SELECT prty, 'NY' AS id FROM pool_NY AS pr2 WHERE seg_02_matches.zip = pr2.zip AND seg_02_matches.route = pr2.crrt ) AS pr3 JOIN add_priorities AS ap ON ap.prty = pr3.prty AND ap.poolid = pr3.id ); Might be better still if you had a single "pool" table with the explicit id column, rather than having to manufacture it on the fly with UNION ALL. -- Igor Tandetnik _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users