如何在sqlite中使用单个查询交换两行的值

时间:2014-10-17 06:57:15

标签: android sqlite android-sqlite

我有一个包含单个表的数据库,我想用单个sqlite查询交换两行

我尝试过以下查询,但这不适用于sqlite

UPDATE
rules AS rule1
JOIN rules AS rule2 ON
( rule1.rule_id = 1 AND rule2.rule_id = 4 )
SET
rule1.priority = rule2.priority,
rule2.priority = rule1.priority
;

任何人都完成了这项任务,请帮帮我

1 个答案:

答案 0 :(得分:1)

这样的查询在语法上是有效的,但是可以工作,因为第一行在第二行更新之前会被更新:

UPDATE rules
SET priority = CASE rule_id
               WHEN 1 THEN (SELECT priority FROM rules WHERE rule_id = 4)
               WHEN 4 THEN (SELECT priority FROM rules WHERE rule_id = 1)
               END
WHERE rule_id IN (1, 4)

如果您想要单个查询的原因是速度,那么只需对所有四个语句使用单个事务;这是你能得到的最快速度:

db.beginTransaction();
try {
    long prio1 = DatabaseUtils.longForQuery(db,
                    "SELECT priority FROM rules WHERE rule_id = " + 1, null);
    long prio4 = DatabaseUtils.longForQuery(db,
                    "SELECT priority FROM rules WHERE rule_id = " + 4, null);
    db.execSQL("UPDATE rules SET priority = " + prio4 + " WHERE rule_id = " + 1);
    db.execSQL("UPDATE rules SET priority = " + prio1 + " WHERE rule_id = " + 4);
    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
}