Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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 Microsoft SQL和JDBC中准备语句中奇数位置的参数_Java_Sql_Sql Server 2008_Scala_Jdbc - Fatal编程技术网

Java Microsoft SQL和JDBC中准备语句中奇数位置的参数

Java Microsoft SQL和JDBC中准备语句中奇数位置的参数,java,sql,sql-server-2008,scala,jdbc,Java,Sql,Sql Server 2008,Scala,Jdbc,因此,我在Microsoft SQL 2008中执行以下语句: SELECT 'UTC' AS timezone, rel.unique_id AS relay,sns.unique_id AS sensor, dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) AS time, SUM(CONVERT(FLOAT,dat.data)) AS total FROM sensor_data dat LE

因此,我在Microsoft SQL 2008中执行以下语句:

  SELECT
  'UTC' AS timezone,
  rel.unique_id AS relay,sns.unique_id AS sensor,
  dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) AS time,
  SUM(CONVERT(FLOAT,dat.data)) AS total
  FROM sensor_data dat
   LEFT OUTER JOIN data_package pak ON dat.package_id = pak.id
   LEFT OUTER JOIN relays rel ON pak.relay_id = rel.id
   LEFT OUTER JOIN sensors sns ON dat.sensor_id = sns.id
   LEFT OUTER JOIN sensor_types typ ON sns.sensor_type = typ.id
   WHERE typ.name = 'Volume' AND dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) > ? AND dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) < ?
   GROUP BY rel.unique_id,sns.unique_id, dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0)
   ORDER BY time,relay,sensor
我得到一个错误:

Caused by: java.sql.SQLException: Column 'data_package.rtime' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
如果我手动输入15秒?在空格中,查询仅以日期作为参数就可以完美地工作

1) 是否需要对间隔值进行参数化(在本例中为15),或者在它成为一个准备好的语句之前,我只需对其进行转义、搜索和替换(如果是这样,在Scala/Java中转义该参数的最佳方法是什么)


2) 我可以避免重复dateadd(datediff())部分三次吗?我知道我不能在WHERE子句中引用“时间”,但是否有其他方法可以指定某个地方使其更干净?

您的选择看起来像:

SELECT dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) AS time,
您的小组成员:

GROUP BY dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0)
用常量替换
,这两个值是相同的

但是使用未命名的参数会带来一个问题。选择版本使用参数1和2,分组版本使用参数9和10。现在,SQL Server并没有这样做,因为这些参数总是相等的。所以它抛出了一个错误

可以通过计算子查询中的字段来避免这种情况:

left join
        (
        select  *
        ,       dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) as X
        from    data_package
        ) as pak
on      dat.package_id = pak.id
现在,您可以在查询的其他部分中参考
pak.X
,如:

group by
        pak.X

Andomar是对的,问题在于小组中参数的使用,但我相信他的解决方案可能过于复杂。我认为,更容易写:

SELECT
  'UTC' AS timezone,
  rel.unique_id AS relay,sns.unique_id AS sensor,
  dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) AS time,
  SUM(CONVERT(FLOAT,dat.data)) AS total
  FROM sensor_data dat
   LEFT OUTER JOIN data_package pak ON dat.package_id = pak.id
   LEFT OUTER JOIN relays rel ON pak.relay_id = rel.id
   LEFT OUTER JOIN sensors sns ON dat.sensor_id = sns.id
   LEFT OUTER JOIN sensor_types typ ON sns.sensor_type = typ.id
   WHERE typ.name = 'Volume' AND dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) > ? AND dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) < ?
   GROUP BY rel.unique_id,sns.unique_id, time
   ORDER BY time,relay,sensor
选择
“UTC”作为时区,
rel.unique_id作为继电器,sns.unique_id作为传感器,
dateadd(分钟,datediff(分钟,0,pak.rtime)/?*?,0)作为时间,
总和(转换(浮动,数据数据))为总和
来自传感器数据
dat.package\u id=pak.id上的左外连接数据包pak
左侧外部连接继电器rel ON pak.relay_id=rel.id
左侧外部连接传感器sns ON dat.sensor_id=sns.id
左侧外部连接传感器类型sns上的典型类型。传感器类型=典型id
其中,typ.name=‘Volume’和dateadd(分钟,datediff(分钟,0,pak.rtime)/?*?,0)>?和dateadd(分钟,datediff(分钟,0,pak.rtime)/?*?,0)<?
按相对唯一id、sns.唯一id、时间分组
按时间、继电器、传感器排序

(另一方面,因为在您的特定情况下,您在WHERE中使用的是完全相同的表达式,可能子查询会更好。)

不需要使用子查询,应该使用派生表fine@a_horse_with_no_name:派生表和子查询之间有什么区别?
SELECT
  'UTC' AS timezone,
  rel.unique_id AS relay,sns.unique_id AS sensor,
  dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) AS time,
  SUM(CONVERT(FLOAT,dat.data)) AS total
  FROM sensor_data dat
   LEFT OUTER JOIN data_package pak ON dat.package_id = pak.id
   LEFT OUTER JOIN relays rel ON pak.relay_id = rel.id
   LEFT OUTER JOIN sensors sns ON dat.sensor_id = sns.id
   LEFT OUTER JOIN sensor_types typ ON sns.sensor_type = typ.id
   WHERE typ.name = 'Volume' AND dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) > ? AND dateadd(MINUTE, datediff(MINUTE, 0, pak.rtime) / ? * ?, 0) < ?
   GROUP BY rel.unique_id,sns.unique_id, time
   ORDER BY time,relay,sensor