Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 组合来自一个表的多个SELECT查询结果_Java_Postgresql - Fatal编程技术网

Java 组合来自一个表的多个SELECT查询结果

Java 组合来自一个表的多个SELECT查询结果,java,postgresql,Java,Postgresql,我的表格坐标是: id(PK)序列号、地址(VARCHAR)、城市(VARCHAR)、纬度(VARCHAR)、经度(VARCHAR) 我有一个包含10000个地址的列表,如果该地址存在于表中,我将遍历该列表以检索相应的纬度/经度 SELECT查询如下所示: 从地址=?城市=? 然后我检查结果集,看是否存在匹配。然后,其他9999个地址通过上面的查询循环,这需要很长时间 有没有办法创建一个包含所有10000个地址的查询,并返回一个包含4列的结果集:|地址|城市|纬度|经度| 未找到的任何地址在该结

我的表格坐标是:

id(PK)序列号、地址(VARCHAR)、城市(VARCHAR)、纬度(VARCHAR)、经度(VARCHAR)

我有一个包含10000个地址的列表,如果该地址存在于表中,我将遍历该列表以检索相应的纬度/经度

SELECT
查询如下所示:

从地址=?城市=?

然后我检查结果集,看是否存在匹配。然后,其他9999个地址通过上面的查询循环,这需要很长时间

有没有办法创建一个包含所有10000个地址的查询,并返回一个包含4列的结果集:
|地址|城市|纬度|经度|

未找到的任何地址在该结果集列中应有一个空(0或null)lat/lon值。我假设我可以循环结果集来识别遗漏的任何内容,比10000条语句快得多


最好的方法是什么?

更新:更改为在结果中包含不匹配的“查询”地址,并添加查询ID以帮助识别“查询”地址,该地址可能只是提供查询参数的列表中的索引

因为它是PostgreSQL,所以可以使用
VALUES
子句,例如

选择q.QUERY\u ID
,c.地址
,c.城市
,c.纬度
,c.经度
从(值(1、、?)
,(2,,?)//根据需要重复多次
, (3, ?, ?)
)AS q(查询ID、地址、城市)
左连接坐标为c
关于c地址与q地址
c.CITY和q.CITY一样

现在,您需要遍历10000个地址,并为该
PreparedStatement

设置所有值。对于10000对,查询长度可能是一个问题。此外,如果你绝对需要一次成功,你可以试试这个

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

SELECT tbl.val1, tbl.val2
FROM tbl
WHERE (tbl.val1, tbl.val2) in (select tmp_table.val1, tmp_table.val2 from tmp_table);
也可以选择加入,而不是加入

更新:

(1) 插入必须是每行一个。可能创建一个脚本文件,其中包含一些提交;语句在几百行中出现一次。如果是从Java完成的,则可以使用JDBCAddBatch在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)


你为什么既做
=
又像
那样做
?类似“%FOO%”的条件
x
包括所有
x='FOO'
为真的记录。“我正在执行10000个SELECT查询”,但您也说了“这是它的1/4”,并显示了一个包含3个SELECT子句的语句,因此如果3是1/4,那么您正在执行12个SELECT查询,而不是10000个。不,您误解了这可能是我的错。我将改写它:
SELECT
querywith
UNION
包含12个查询。。。。但它的目的是在我的表中找到一个地址/坐标匹配。这12个查询解释了地址的差异,如我所解释的。我有
10000个地址
每个地址都将通过12个查询
SELECT/UNION
块。明白吗?所以,不要循环所有10000个地址,并将它们的地址/城市分别放入SELECT/UNION查询中。。。我想要一个包含所有10000个地址的查询,这样会更快。谢谢,这看起来很有希望。请您解释一下这个查询是做什么的,因为我不知道
t
c
是什么。此外,不匹配的地址必须作为空的lat/lon包含在结果集中,这样我就可以识别哪些地址不匹配。这样做有效,而且速度肯定更快。非常感谢Andreastanks,如果有更快的替代方法,我不需要在一个查询中完成。您的回答让我想知道(1)插入临时表的
代码是什么样子的(2)您的代码实际上在做什么。(3) 在我的问题中,val1和val2对应什么。(4) 我的查询响应需要4列(address、city、lon、lat),而不仅仅是2列(val1、val2)。@Andreas正在将整个10000列加载到查询中的一个虚拟表中,并进行连接。如果这行得通,那可能是更好的选择。即使不这样,你也可以一次尝试500或1000的方法。但是,随着字符串长度的变化,大型查询可能变得不可预测。我的方法相对比较安全,但速度可能较慢。但是,它仍然会比10000个单独的select查询更快。所以,这是一种中等性能的方法。谢谢。为什么绳子的长度会变化呢?如果我使用StringBuilder来构建准备好的语句,然后设置适当数量的参数,我看不出字符串长度在哪里起作用。1MB查询字符串和PreparedStatement就可以了。一个难得的机会,在晴朗的一天,它可能抛出一个OutOfMemoryError。如果按行数对其进行批处理,并且每行的大小可以不同,则查询的大小将不同。1000行在一次运行中可能为10KB,在下一次运行中可能为50KB。
SELECT ADDRESS, CITY, LATITUDE, LONGITUDE
FROM coordinates
WHERE (ADDRESS, CITY) in (select tmp_table.address, tmp_table.city from tmp_table);