Я использую приведенный ниже SQL-запрос для извлечения некоторых данных из базы данных. Я использую СУБД H2, нативную реализацию Java. Несмотря на то, что я могу получить указанные данные с помощью инструмента H2, он дает мне следующую ошибку, когда я использую его как PreparedStatement в JAVA:
"; expected ")"; 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;
Я пробовал использовать новые строки, 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();
Функция appendString просто добавляет новую строку к строке. Я использую это в подготовленном заявлении
Что я делаю неправильно?
Обновлено: Это полная ошибка, о которой идет речь
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 ")";
После PARTITION стоит [*]. Значит ли это, что ошибка происходит там?
Когда вы добавляете, вы исключаете пробелы. например. ... AS num"); appendString(sb, "FROM("); становится "AS numFROM("
@ Лино та же ошибка ...
@xtratic об этом позаботится функция appendString: private void appendString(StringBuilder sb, String val){ sb.append(val + System.lineSeparator()); }
Распечатайте свою строку sql и просмотрите.
Какие значения вы указываете для заполнителей ??
@Arnaud TimeStamp и массив
почему вы не используете переменную String здесь
sout ваш запрос и запустить его против вашей базы данных
Похоже, вы воспользовались советом Линоса, я удивлен, что на самом деле это было не так. Теперь попробуйте полностью удалить новые строки и посмотреть, исправит ли это что-нибудь. используйте sb.append(val).append(" "); вместо sb.append(val + System.lineSeparator());
Я попробовал это так, а также просто скопировав sql-запрос из инструмента в строку, та же ошибка. Похоже, ошибка где-то рядом с PARTITION.




Ах, вы используете H2, спасибо за добавление этого флага. H2 похоже не поддерживает PARTITION. Посмотреть здесь
это странно, потому что кажется, что в консоли h2 это работает нормально: i.imgur.com/ct0esPM.png Знаете ли вы, почему это работает здесь?
@Minimax без понятия
Вы должны заключить параметр массива ? в круглые скобки:
... horseid IN (?) ...
Что произойдет, если вы просто удалите
;в конце?