admin

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

sql

我有表SQLite数据库myTable和列idposXposY。行数不断变化(可能增加或减少)。如果我知道id每一行的值和行数,是否可以执行一次SQL查询以根据ID更新所有具有不同值的posXposY字段?

例如:

---------------------
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是存储posXposY字段的新值的数组。

如果,例如,arrayXarrayY包含以下值:

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中做所有这些事情。


阅读 224

收藏
2021-05-10

共1个答案

admin

有一对夫妇的方式来做到这一点 体面 有效。

首先-
如果可能,您可以对临时表进行某种批量插入。这在某种程度上取决于您的RDBMS
/宿主语言,但最糟糕的是,可以通过简单的动态SQL(使用VALUES()子句)然后使用标准的from-another-
table更新来完成。尽管大多数系统都提供了用于批量加载的实用程序

第二-
而且这在某种程度上也依赖RDBMS,因此您可以构造一个动态更新语句。在这种情况下,VALUES(...)CTE内部的子句是即时创建的:

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语法,但我无法使它发挥作用)

2021-05-10