如何更新具有相同值的多行(不是行)?

时间:2015-02-28 03:48:47

标签: android sqlite

我的表tbl1看起来像这样(SQLFiddle):

id  col1    col2    col3
1   0       1       0
2   1       0       0
3   0       0       1
4   1       1       1
5   0       0       0

我的要求是我从每个列的用户那里得到一些正数,如果它们包含零,我需要更新特定列的行,最后我应该计算更新的行数和它们之间的差异。用户输入和我应该添加到最后一行的更新计数。

让我用例子解释一下:
假设用户输入10作为col1。 col1有3行​​包含零,所以我将它们更新为1,最后差异即(10 - 3 = 7)我应该在最后一行更新。

更新后,我希望该表看起来像这样:

id  col1    col2    col3
1   1       1       0
2   1       0       0
3   1       0       1
4   1       1       1
5   8       0       0 
update tbl1 set col1=1 where id in (select id from tbl1 where col1=0 limit 10)

以上查询将所有0更新为1,但如何将剩余部分添加到最后一行?

2 个答案:

答案 0 :(得分:1)

要完成任务,我会使用2个更新查询。第一个是你已经拥有的查询:

UPDATE tbl1 SET col1=1 WHERE id IN (SELECT id FROM tbl1 WHERE col1=0 LIMIT 10);

我会将第一个更新查询的结果保存在变量中(因为它返回受影响的行数),并在下一个查询中使用该结果:

UPDATE tbl1 SET col1 = col1+updateResult  ORDER BY id DESC LIMIT 1;

updateResult是第一次更新查询返回的内容。)

我希望这会有所帮助。

答案 1 :(得分:0)

首先,找出要更新的行数:

SELECT COUNT(*)
FROM tbl1
WHERE id IN (SELECT id
             FROM tbl1
             WHERE col1 = 0
             LIMIT 10)

更新那些:

UPDATE tbl1
SET col1 = 1
WHERE id IN (SELECT id
             FROM tbl1
             WHERE col1 = 0
             ORDER BY id
             LIMIT 10)

(如果没有ORDER BY,则会更新一些随机的十行行。)

然后更新最后一行:

UPDATE tbl1
SET col1 = col1 + (10 - ResultFromAbove)
WHERE id = (SELECT MAX(id)
            FROM tbl1)

为确保一致性,请在一个transaction中执行所有操作。