Операторы HSQLDB-updatable не работают с "SELECT TOP" или " ORDER BY"


Я использую HSQLDB и preparedStatements просто отлично, но если я включаю либо "SELECT TOP", либо "ORDER BY" в мою инструкцию SQL, когда я вызываю updateBoolean (или UpdateInt и т. д.), Я попадаю в исключение:

java.sql.SQLException: attempt to assign to non-updatable column

Этот пример кода отлично работает:

preparedStatement = connection.prepareUpdatable(
    "SELECT " + MyTable.COL_ID + ", " +
        MyTable.COL_READ +
        " FROM " + MyTable.NAME +
        " WHERE " + MyTable.COL_LOCAL +
        " =? AND " + MyTable.COL_REMOTE +
        " =?",
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_UPDATABLE);

preparedStatement.setString(1, localAddress);
preparedStatement.setString(2, remoteAddress);

ResultSet rs = connection.query(preparedStatement);

if (rs.next())
{
    rs.updateBoolean(MyTable.COL_READ, isRead);
    rs.updateRow();
}

Я получаю исключение, если меняю "SELECT "на"SELECT TOP". Или если я добавлю это к инструкции SQL:

" ORDER BY " + MyTable.COL_RECEIVED_TIMESTAMP + " DESC"

Спасибо за любую помощь.

Никб

1 2

1 ответ:

Обновляемый оператор SELECT не может иметь TOP n, LIMIT или ORDER BY. Это ограничение накладывается стандартом SQL. Ваш выбор становится недоступным для обновления, когда вы добавляете одно из этих ключевых слов.

Можно использовать подзапрос в предложении WITH с указанными выше ключевыми словами, и SELECT можно обновить.

CREATE TABLE t (a int, b int, PRIMARY KEY(a));

WITH SUBQ(COL) AS (SELECT TOP 1 a FROM t) 
  SELECT * FROM t WHERE a IN (SELECT * FROM SUBQ)