我正在我的应用程序中使用Room,并且希望根据选择顺序来更新结果。 目标是更新五个得分最高的结果。 在我的Dao类中,我有以下查询:
// Setting new five words
@Query("with data as( SELECT score FROM words_table ORDER BY score DESC LIMIT 5 )" +
" UPDATE data SET isInTodayWords= 1")
LiveData<List<Word>> setNewWords();
我从更新语句中得到一个错误-“无法解析符号数据”。 我在这里想念什么?
答案 0 :(得分:0)
我认为问题在于您需要更新实际表而不是CTE。尝试:-
@Query("with data as( SELECT score FROM words_table ORDER BY score DESC LIMIT 5 )" +
" UPDATE words_table SET isInTodayWords= 1")
LiveData<List<Word>> setNewWords();
根据(限定表名称):-
说我相信您需要利用WHERE子句中的CTA(数据),否则所有行都将被更新。
因此,您可能希望添加WHERE score IN data
(请参见以下注释,因为这可能适用,如果一行具有唯一列,则您可能更喜欢提取该分数而不是分数并在WHERE子句中使用它) :-
@Query("WITH data AS (SELECT score FROM words_table ORDER BY score DESC LIMIT 5) UPDATE words_table SET isInTodaysWords = 1 WHERE score IN data")
一种替代方法是使用:-
@Query("UPDATE words_table SET isInTodaysWords = 1 WHERE score >= (SELECT min(score) FROM (SELECT * FROM words_table ORDER BY score DESC LIMIT 5))")
但是,如果说有10行都具有相同的topscore,则将标记所有10行。
如果存在一个名为 _id 的唯一列,则以下内容会将标记限制为所选的5行:-
@Query("WITH data AS (SELECT _id FROM words_table ORDER BY score DESC LIMIT 5) UPDATE words_table SET isInTodaysWords = 1 WHERE _id IN data")