I have the following two tables and related indexes --

   CREATE TABLE IF NOT EXISTS pt (
     id INTEGER PRIMARY KEY,
     x        REAL,
     y        REAL,
     attr     TEXT
   )

   CREATE INDEX ix_pt_x ON pt (x)
   CREATE INDEX ix_pt_y ON pt (y)

   CREATE TABLE IF NOT EXISTS py (
     id  INTEGER PRIMARY KEY,
     xmin      REAL,
     ymin      REAL,
     xmax      REAL,
     ymax      REAL,
     attr      TEXT
   )

   CREATE INDEX ix_py ON py (xmin, ymin, xmax, ymax)

I want to UPDATE pt SETting pt.attr = py.attr WHEREver the Count of
(pt.x  BETWEEN py.xmin AND py.xmax  AND pt.y  BETWEEN py.ymin AND
py.ymax) is 1.

So, I have come up with the following way -- I have created a view to
do my SELECTs

   CREATE VIEW v_attr AS
     SELECT pt.id AS pt_id, Count(pt.id) AS pt_id_count, py.attr AS py_attr
     FROM pt JOIN py ON
       (
         (pt.x BETWEEN py.xmin AND py.xmax) AND
         (pt.y BETWEEN py.ymin AND py.ymax)
       )
     GROUP BY pt_id_count
     HAVING pt_id_count = 1
   )

Well, any SELECTs from the view v_attr take forever. Anyway to speed it up?

If all of the above works, then I can do the following UPDATE --

   UPDATE pt AS a_pt
   SET attr = (
     SELECT py_attr
     FROM v_attr
     WHERE a_pt.id = v_attr.pt_id
   )

And so I ask you, does this make sense? Is my JOIN okay? One local wag
was saying that JOINs can only be done using '=', not BETWEEN.
Nevertheless, perhaps a SQL guru on this list can guide me on this
task.


--
Puneet Kishor http://punkish.eidesis.org/
Nelson Inst. for Env. Studies, UW-Madison http://www.nelson.wisc.edu/
Open Source Geospatial Foundation https://edu.osgeo.org/

-----------------------------------------------------------------------------
To unsubscribe, send email to [EMAIL PROTECTED]
-----------------------------------------------------------------------------

Reply via email to