Объединение нескольких результатов запроса SELECT из ОДНОЙ таблицы - PullRequest
0 голосов
/ 17 ноября 2018

Моя таблица coordinates:

id (PK) SERIAL, address (VARCHAR), city (VARCHAR), latitude (VARCHAR), longitude (VARCHAR)

У меня есть список из 10000 адресов, по которым я зацикливаюсь, чтобы получить соответствующую широту / долготу, если адрес существует встол.

Запрос SELECT выглядит следующим образом:

SELECT ADDRESS, CITY, LATITUDE, LONGITUDE FROM coordinates WHERE address = ? AND city = ?

Затем я проверяю набор результатов, чтобы увидеть, было ли совпадение.Затем остальные 9999 адресов проходят через указанный выше запрос, который занимает слишком много времени.

Есть ли способ создать ОДИН запрос, который содержит все 10000 адресов и возвращает набор результатов с 4 столбцами: |address|city|latitude|longitude|

Любой не найденный адрес должен иметь пустое (0 или нулевое) значение широты / долготы в этом столбце набора результатов.Я предполагаю, что мог бы затем зациклить набор результатов, чтобы определить что-то пропущенное, намного быстрее, чем 10 000 операторов.

Какой лучший подход?

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Длина запроса может быть проблемой для 10000 пар. Также, если вам абсолютно необходимо сделать это одним ударом, вы можете попробовать это.

Вставьте значения во временную таблицу. Тогда:

SELECT tbl.val1, tbl.val2
FROM tbl
WHERE (tbl.val1, tbl.val2) in (select tmp_table.val1, tmp_table.val2 from tmp_table);

Также альтернативно JOIN вместо IN.

Обновление:

(1) Вставки должны быть по одной на строку. Вероятно, создайте файл сценария с некоторым COMMIT; заявления один раз в несколько сотен строк. Если это сделано из Java, вы можете использовать JDBC addBatch для фиксации один раз в 500/1000 строк.

--Create temp table before this with two columns address (VARCHAR), city (VARCHAR)
INSERT INTO TMP_TABLE VALUES ( ?, ?); //Prepare statement and addBatch

(2, 3, 4)

SELECT ADDRESS, CITY, LATITUDE, LONGITUDE
FROM coordinates
WHERE (ADDRESS, CITY) in (select tmp_table.address, tmp_table.city from tmp_table);
0 голосов
/ 17 ноября 2018

ОБНОВЛЕНИЕ: Изменено, чтобы включить несоответствующие адреса "запроса" в результат, и добавлено QUERY_ID, чтобы помочь идентифицировать адреса "запроса", которые могут быть просто индексом в списке, предоставляющем параметры запроса.

Поскольку это PostgreSQL, вы можете использовать предложение VALUES, например,

SELECT q.QUERY_ID
     , c.ADDRESS
     , c.CITY
     , c.LATITUDE
     , c.LONGITUDE
  FROM (VALUES (1, ?, ?)
             , (2, ?, ?) // repeat as many times as needed
             , (3, ?, ?)
       ) AS q (QUERY_ID, ADDRESS, CITY)
  LEFT JOIN coordinates AS c
       ON  c.ADDRESS LIKE q.ADDRESS
       AND c.CITY LIKE q.CITY

Теперь вам нужно перебрать 10000 адресов и установить все значения для этого PreparedStatement.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...