当一个值依赖于查询

时间:2015-05-03 17:26:58

标签: java sql postgresql jpql

数据库:

Table_Sensor:
    sensor_id,
    sensor_name

Table_Sensor_Detection:
    sensor_id
    azimuth (azimuth from specific sensor)

用户可以输入多个传感器,因此我定义了Set < Integer> sensorsSet

用户还可以为每个传感器输入azimuth for each sensor,因此我有Sensor.azimuth

我需要的只是SQL语句的逻辑,它将为输入的sensor_detections提供所有sensors_ids,并为每个传感器提供足够的方位角的另一个查询。

这是描述我想要完成的逻辑的List< String> queryList

for(Integer enteredSensorId:sensorsSet)
{
    querysList.add(
        "SELECT s FROM Table_Sensor_Detection s " +
        "WHERE s.sensor_id="+enteredSensorId +
        "AND s.azimuth"=getAzimuthForSenzor(enteredSensorId)
    );
}

上面的代码已经过简化,因此不必担心可能出现的错误。我只想知道解决这个问题的最佳方法是什么:

a)创建多个SQL查询,单独运行它们并合并结果(类似于上面的代码),

b)创建一个SQL查询(如果可能的话,最好的解决方案),

c)别的东西(什么?)?

2 个答案:

答案 0 :(得分:0)

我从讨论开始就用我的算法解决了问题;我为该传感器的每个传感器和方位角创建一个SQL查询,最后我将每个查询的结果合并为单个ArrayList。

这有效,但我想知道单个SQL查询有更好的设计吗?

我认为理查德的答案并没有解决问题,因为我仍然需要多次查询。我正在寻找的是单个高级SQL查询。

答案 1 :(得分:0)

简单的方法是构建一个包含两列的IN列表:

SELECT *
FROM Table_Sensor_Detection 
WHERE (sensor_id, azimuth) IN ( (1, 10.0), (2, 15.0), .... )

根据您的示例代码,您应该能够构建该条件。

IN个列表(“数百个”值)通常很慢。更好的方法是建立一个长values子句,然后将其加入到表中:

SELECT s.*
FROM Sensor_Detection s
  JOIN (
     values (1, 10.0), (2, 15.0) 
  ) as t (id, azm)
  ON s.sensor_id = t.id AND s.azimuth = t.azm;

SQLFiddle:http://sqlfiddle.com/#!15/77c28/1

不相关但是:请确保您的azimuth列定义为numericdecimal定义为float - 否则您将可能没有得到你想要的东西。