我的表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条语句快得多。
什么是最好的方法?
答案 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);