合并一个表中的多个SELECT查询结果

时间:2018-11-16 22:23:36

标签: java postgresql

我的表coordinates是:

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

我有一个10,000个地址的列表,如果表中存在该地址,我将遍历这些地址以检索相应的纬度/经度。

SELECT查询如下:

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

然后我检查结果集以查看是否存在匹配项。然后,其余的9,999个地址将通过上面的查询循环,这花费了太长时间。

是否可以创建一个包含所有10,000个地址的查询,并返回包含4列的结果集:|address|city|latitude|longitude|

在该结果集列中,找不到的任何地址的经纬度值应为空(0或null)。我假设我然后可以循环结果集以识别丢失的任何内容,比10,000条语句快得多。

什么是最好的方法?

2 个答案:

答案 0 :(得分:1)

更新:已更改为在结果中包括不匹配的“查询”地址,并添加了QUERY_ID以帮助识别“查询”地址,该地址可能只是列表中提供查询参数的索引。< / p>

由于它是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的所有值。

答案 1 :(得分:1)

查询长度可能是10,000对的问题。另外,如果您绝对需要一击即做,可以尝试一下。

将这些值插入到临时表中。然后:

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);