根据选择更新房间

时间:2019-09-16 20:19:32

标签: sql-update android-room

我正在我的应用程序中使用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();

我从更新语句中得到一个错误-“无法解析符号数据”。 我在这里想念什么?

1 个答案:

答案 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();

根据(限定表名称):-

enter image description here

说我相信您需要利用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")