简体   繁体   English

使用 JDBC 在工具中工作但在 Java 中不工作的 SQL 语句

[英]SQL statement working in tool but not in Java using JDBC

I'm using the below SQL query to fetch some data from the database.我正在使用下面的 SQL 查询从数据库中获取一些数据。 The DBMS I'm using is H2, a native java implementation.我使用的 DBMS 是 H2,它是一个原生的 Java 实现。 Even though I can retrieve said data using a H2 tool, it gives me the following error when I use it as a PreparedStatement in JAVA:尽管我可以使用 H2 工具检索所述数据,但当我将其用作 JAVA 中的PreparedStatement时,它给了我以下错误:

"; expected ")"; SQL statement: ... "; 预期 ")"; SQL 语句: ...

SELECT * FROM (
   SELECT temp.*, ROW_NUMBER() OVER (PARTITION BY horseid ORDER BY updated desc) as num
   FROM(
   select horseid, name, breed, min_speed, max_speed, updated from horsehistory
   UNION
   select id, name, breed, min_speed, max_speed, updated from horse
   ) as temp
   WHERE updated<? AND horseid in ?
)
WHERE num = 1;

I've tried using newlines, stringbuilder with line separator to no avail.我试过使用换行符,带行分隔符的 stringbuilder 无济于事。

StringBuilder sb= new StringBuilder();
    appendString(sb, "SELECT * FROM (");
    appendString(sb, "SELECT temp.*, ROW_NUMBER() OVER (PARTITION BY horseid ORDER BY updated desc) AS num");
    appendString(sb, "FROM(");
    appendString(sb, "SELECT horseid, name, breed, min_speed, max_speed, updated FROM horsehistory");
    appendString(sb, "UNION");
    appendString(sb, "SELECT id, name, breed, min_speed, max_speed, updated FROM horse");
    appendString(sb, ") AS temp");
    appendString(sb, "WHERE updated < ? AND horseid IN ?");
    appendString(sb, ")");
    appendString(sb, "WHERE num = 1;");
    String sql=sb.toString();

The appendString function just appends a newline to the String. appendString 函数只是将换行符附加到字符串。 I use this in a preparedstatement我在一个准备好的语句中使用它

What am I doing wrong?我究竟做错了什么?

EDIT: This is the full error in question编辑:这是有问题的完整错误

Syntax error in SQL statement "SELECT * FROM ( SELECT TEMP.*, ROW_NUMBER() OVER (PARTITION[*] BY        HORSEID ORDER BY UPDATED DESC) AS NUM FROM ( SELECT HORSEID, NAME, BREED, MIN_SPEED, MAX_SPEED, UPDATED FROM HORSEHISTORY UNION SELECT ID, NAME, BREED, MIN_SPEED, MAX_SPEED, UPDATED FROM HORSE ) AS TEMP WHERE UPDATED < ? AND HORSEID IN (?) ) WHERE NUM = 1  "; expected ")";

There is a [*] after PARTITION. PARTITION 后有一个 [*]。 Does this mean that the error occurs there?这是否意味着错误发生在那里?

You have to wrap your array-parameter ?你必须包装你的数组参数? in parentheses:在括号内:

... horseid IN (?) ...

Ah, you're using H2 , thanks for adding that flag.啊,您正在使用H2 ,感谢您添加该标志。 H2 doesn't seem to support PARTITION . H2似乎不支持PARTITION See here看这里

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM