我有表SQLite数据库myTable和列id,posX,posY。行数不断变化(可能增加或减少)。如果我知道id每一行的值和行数,是否可以执行一次SQL查询以根据ID更新所有具有不同值的posX和posY字段?
myTable
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和arrayY包含以下值:
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 ---------------------
这可能吗?我现在正在为每个查询更新一行,但是随着行数的增加,它将需要数百个查询。顺便说一下,我正在AIR中做所有这些事情。
有一对夫妇的方式来做到这一点 体面 有效。
首先- 如果可能,您可以对临时表进行某种批量插入。这在某种程度上取决于您的RDBMS /宿主语言,但最糟糕的是,可以通过简单的动态SQL(使用VALUES()子句)然后使用标准的from-another- table更新来完成。尽管大多数系统都提供了用于批量加载的实用程序
VALUES()
第二- 而且这在某种程度上也依赖RDBMS,因此您可以构造一个动态更新语句。在这种情况下,VALUES(...)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语法,但我无法使它发挥作用)