2016-08-20 3 views
0

Я использую расширение PostGIS для PostgreSQL и иметь таблицу, как это:Как выполнить несколько SQL запросов на выборку в пакете

CREATE TABLE areas 
(
    id integer NOT NULL DEFAULT nextval('areas_id_seq'::regclass), 
    name character varying(1024) NOT NULL, 
    shape geometry NOT NULL, 
    CONSTRAINT pk_id PRIMARY KEY (id) 
) 

Мое приложение получает несколько координатные точки (пары LAT/LNG) и для каждой точки, мне нужно найдите соответствующую область. Поэтому SQL для одной точки выглядит как

SELECT id, name FROM areas WHERE ST_Within(shape, ST_MakePoint(lng, lat)); 

Но мне нужно выполнить этот запрос для нескольких точек. Я могу выполнить отдельный запрос для каждой точки, но я предполагаю, что для достижения этого будет один запрос.

Конечно, я могу использовать UNION здесь, но:

  • насколько я понимаю N запросы, объединенные с UNION не быстрее, чем отдельные N запросами
  • изображения У меня есть 3 очка в входе, я совмещаю 3 выбирает и получает только 2 области в результате. Мне нужно понять, в какой области соответствует точка (и в какой точке нет связанной области), а это значит, что мне нужно сделать это в моем коде (который может быть длинным, если есть 3000 точек вместо 3) даже PostGIS уже сделан все проверки.

Я думаю, что можно создать временную таблицу, поставить туда точки ввода, а затем выполнить JOIN select для обеих таблиц. Но, вероятно, есть лучший способ.

Вопрос: какой более быстрый способ в PostgreSQL (или любой другой RDBMS) для N входных значений выполняет тот же запрос и получает точные результаты N в том же порядке, что и входные значения (предполагается, что для некоторых значений входных значений будет NULL)?

ответ

0

Ну, вы могли бы попробовать что-то вроде этого:

SELECT a.id, a.name, p.which 
FROM areas a JOIN 
    (SELECT lng1 as lng, lat1 as lat, 'point1' as which UNION ALL 
     SELECT lng2, lat2, 'point2' as which 
    ) p 
    ON ST_Within(a.shape, ST_MakePoint(p.lng, p.lat));