Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在单个SQL查询中使用不同的值更新多行_Sql_Sqlite_Rows - Fatal编程技术网

在单个SQL查询中使用不同的值更新多行

在单个SQL查询中使用不同的值更新多行,sql,sqlite,rows,Sql,Sqlite,Rows,我有一个SQLite数据库,其中包含表myTable和列id,posX,posY。行数不断变化(可能增加或减少)。如果我知道每一行的id值和行数,我可以执行一个SQL查询来根据id用不同的值更新所有posX和posY字段吗 例如: --------------------- myTable: id posX posY 1 35 565 3 89 224 6 11 456 14 87 475 -----------

我有一个SQLite数据库,其中包含表
myTable
和列
id
posX
posY
。行数不断变化(可能增加或减少)。如果我知道每一行的
id
值和行数,我可以执行一个SQL查询来根据id用不同的值更新所有
posX
posY
字段吗

例如:

---------------------
myTable:

id   posX    posY

1      35     565
3      89     224
6      11     456
14     87     475
---------------------
SQL查询伪代码:

UPDATE myTable SET posX[id] = @arrayX[id], posY[id] = @arrayY[id] "
@arrayX
@arrayY
是存储
posX
posY
字段新值的数组

例如,如果
arrayX
arrayY
包含以下值:

arrayX = { 20, 30, 40, 50 }
arrayY = { 100, 200, 300, 400 }
。。。那么查询后的数据库应该如下所示:

---------------------
myTable:

id   posX    posY

1      20     100
3      30     200
6      40     300
14     50     400
---------------------

这可能吗?我现在正在为每个查询更新一行,但随着行数的增加,将需要数百个查询。顺便说一句,我是在空中做这一切的。

像这样的东西可能适合你:

"UPDATE myTable SET ... ;
 UPDATE myTable SET ... ;
 UPDATE myTable SET ... ;
 UPDATE myTable SET ... ;"
如果任意posX或posY值相同,则可以将它们组合到一个查询中

UPDATE myTable SET posX='39' WHERE id IN('2','3','40');

是的,您可以这样做,但我怀疑这是否会提高性能,除非您的查询有很大的延迟

你可以做:

 UPDATE table SET posX=CASE
      WHEN id=id[1] THEN posX[1]
      WHEN id=id[2] THEN posX[2]
      ...
      ELSE posX END, posY = CASE ... END
 WHERE id IN (id[1], id[2], id[3]...);
总成本大致由以下公式给出:NUM\u querys*(成本查询设置+成本查询性能)。这样,您可以减少一些NUM_查询,但查询性能的成本会大幅提高。如果查询设置的成本非常大(例如,您呼叫的网络服务速度非常慢),那么,是的,您最终可能仍然处于领先地位

否则,我会尝试在id上建立索引,或者修改架构


在MySQL中,我认为通过重复密钥更新时的多次插入,您可以更轻松地做到这一点(但我不确定,从未尝试过)。

有几种方法可以非常有效地实现这一点

第一-
如果可能,可以对临时表进行某种大容量插入。这在某种程度上取决于您的RDBMS/主机语言,但在最坏的情况下,这可以通过一个简单的动态SQL(使用
VALUES()
子句)完成,然后从另一个表进行标准更新。不过,大多数系统都为批量加载提供了实用程序

第二-
这也有点依赖于RDBMS,您可以构造一个动态update语句。在这种情况下,CTE中的
VALUES(…)
子句是动态创建的:

WITH Tmp(id, px, py) AS (VALUES(id1, newsPosX1, newPosY1), 
                               (id2, newsPosX2, newPosY2),
                               ......................... ,
                               (idN, newsPosXN, newPosYN))

UPDATE TableToUpdate SET posX = (SELECT px
                                 FROM Tmp
                                 WHERE TableToUpdate.id = Tmp.id),
                         posY = (SELECT py
                                 FROM Tmp
                                 WHERE TableToUpdate.id = Tmp.id)


WHERE id IN (SELECT id
             FROM Tmp)

(根据文档,这应该是有效的SQLite语法,但我无法让它正常工作)

尝试“更新平板电脑集(row='value'其中id=0001'),(row='value2'其中id=0002'),…

我实际上无法让@Clockwork Muse正常工作。但我可以让这个变体正常工作:

WITH Tmp AS (SELECT * FROM (VALUES (id1, newsPosX1, newPosY1), 
                                   (id2, newsPosX2, newPosY2),
                                   ......................... ,
                                   (idN, newsPosXN, newPosYN)) d(id, px, py))

UPDATE t

SET posX = (SELECT px FROM Tmp WHERE t.id = Tmp.id),
    posY = (SELECT py FROM Tmp WHERE t.id = Tmp.id)

FROM TableToUpdate t
我希望这也适用于你!

使用逗号“,”


要使用列1的不同值更新表,在列2上给定值,可以对SQLite执行以下操作:

"UPDATE table SET column1=CASE WHEN column2<>'something' THEN 'val1' ELSE 'val2' END"
“更新表集column1=当column2'something'然后'val1'或'val2'结束时的情况”

也许这有助于一个很好的例子!不幸的是,正如我所说的,行的数量将发生变化,因此“WHEN”操作符的数量将需要不断地改变。如果你真的很想这样做,你可以动态地构建查询。查询分为五到六部分重新组装,其中三部分(第一种和第二种情况,以及IN条款)内置于一个WHILE循环中。无论如何,如果值发生变化,你应该这样做……你能进一步说明在集合中使用case语句是如何导致COST\u QUERY\u性能提高的吗?你能把你的代码放进答案本身吗?现在如果这个链接消失,你的答案几乎没用了。@GeorgeStocker-啊,谢谢。不知何故我错过了原始标记,我的示例语句在目标RDBMS中无效。希望它现在可以工作…看起来不错!不过有一个小的更正,因为在问题中,列的名称是“id”,它也应该出现在答案中。将“I”替换为“id”“到处都是。我也会在这里有效地使用连接更新TableToUpdate,Tmp SET posX=Tmp.px posY=Tmp.py LEFT JOIN ON(TableToUpdate.id=Tmp.id)@Clockwork Muse我想在iOS中使用它,但我得到以下错误…库例程调用顺序不正确:(有什么想法吗?你可以在文本编辑器中准备这样的语句,并将它们直接粘贴到命令行中。如果没有太多的更新,效果会很好。你真的尝试过吗?这会很好,而且有点像我正在寻找的……对我来说没有意义,因为你需要多个where条件来匹配每一行。你可以吗详细说明?
"UPDATE table SET column1=CASE WHEN column2<>'something' THEN 'val1' ELSE 'val2' END"