Обновление номера несколько полей - PullRequest
0 голосов
/ 30 января 2019

Я хотел бы обновить некоторые поля из table 1, чтобы они совпадали со значениями из другого table (или даже подзапроса).Проблема заключается в том, что я получаю compilation error в моем DAO запросе на обновление, когда имеется более 1 поля.

Вы можете увидеть код (переписанный для общего использования) ниже:

@Query("UPDATE table1 " +
     " SET (field1, field2) = " +
     " (SELECT SUM(table2.foreign_field1) as summaryForeign_field1, table2.foreign_field2 " +
     " FROM table2 " +
     " WHERE   table1.id = table2.id " + 
     " GROUP BY table2.foreign_field2 ) ")
void setFieldsInTable1();

Я проверил запрос с примечаниями в SQLite Update Query Ref , и я попробовал код в DB Browser для SQLite, где он отлично работает.

Любая помощь будет в значительной степениоценили.

1 Ответ

0 голосов
/ 02 февраля 2019

Вы забыли + в строке 4 .

Если это просто ошибка копирования / прошествия, то в исходном запросе должно быть что-то не так, что вы удалили при попыткечтобы сделать его общим для вашего вопроса.

Это должно работать, вот рабочий пример:

Онлайн пример

Код:

BEGIN TRANSACTION;

/* Create tables */
CREATE TABLE table1(
    id integer PRIMARY KEY,
    field1 text,
    field2 text
);

CREATE TABLE table2(
    id integer PRIMARY KEY,
    field1 text,
    foreign_field1 integer,
    FOREIGN KEY(foreign_field1) REFERENCES table1(id)
);

/* Create few records */
INSERT INTO table1 VALUES(1,'Tom', 'French');
INSERT INTO table1 VALUES(2,'Lucy', 'American');
INSERT INTO table1 VALUES(3,'Frank', 'English');
INSERT INTO table1 VALUES(4,'Jane', 'Polish');
INSERT INTO table1 VALUES(5,'Robert', 'French');

INSERT INTO table2 VALUES(1,'Monday', 3);
INSERT INTO table2 VALUES(2,'Wednesday', 5);
INSERT INTO table2 VALUES(3,'Friday', 1);
INSERT INTO table2 VALUES(4,'Tuesday', 4);
INSERT INTO table2 VALUES(5,'Monday', 1);

COMMIT;

/* Display records from the table1 */
SELECT * FROM table1;

/* Update records from table1 */
UPDATE table1 
SET (field1, field2) = (
    SELECT
        SUM(table2.foreign_field1) as summaryForeign_field1,
        table2.field1 
    FROM table2 
    WHERE table1.id = table2.id 
    GROUP BY table2.field1
);

/* Check that the update has been executed correctly */
SELECT * FROM table1;

Так что, возможно, попробуйте создать минимальный онлайн-пример ближе к вашему исходному запросу.

РЕДАКТИРОВАТЬ : ОК, согласно вашему комментарию, который я протестировал, и могу воспроизвести проблему в моем проектедействительно, он не компилируется, ошибка:

ошибка: нет жизнеспособной альтернативы на входе 'обновление теста SET (имя,' посторонний вход ')' ожидание {, ';', ',','=', '*', '+', '-', '||', '/', '%', '<<', '>>', '&', '|', '<', '<=', '>', '> =', '==', '! =', '<>', ...}

К сожалению, я думаю, что это комнатаограничение.Возможно, вы можете отправить вопрос в Google, чтобы получить больше информации об этом.

Между тем, вы можете попробовать с RawQuery (как указано в документе, он ДОЛЖЕН возвращать тип, отличный от void, но выможет возвратить поддельную строку или пустой POJO, например):

@RawQuery
String setFieldsInTable1(SupportSQLiteQuery query);

Затем используйте его так:

SimpleSQLiteQuery query = new SimpleSQLiteQuery("UPDATE table1 SET ...");
yourDao.setFieldsInTable1(query);

Другое решение состоит в том, чтобы просто пойти с двумя подзапросами следующим образом:

UPDATE table1
SET field1 = (
    SELECT SUM(table2.foreign_field1)
    FROM table2
    WHERE table1.id = table2.id
    GROUP BY table2.foreign_field2
),
field2 = (
    SELECT table2.foreign_field2
    FROM table2
    WHERE table1.id = table2.id
);

Также в зависимости от рабочего процесса приложения вы можете изменить свою сущность в своем коде, а затем использовать интерфейс Update для ее обновления:

@Update
void update(Table1Entity... table1Entities);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...