数据库:
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)别的东西(什么?)?
答案 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
列定义为numeric
或decimal
而不定义为float
- 否则您将可能没有得到你想要的东西。