在更新一个SQL查询使用不同的值多行(Update multiple rows with diffe

2019-06-26 09:48发布

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

例如:

---------------------
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
---------------------

这可能吗? 现在我更新每个查询一列,但它要采取数百查询作为行数增加的。 我的方式做这一切在空气中。

Answer 1:

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

第一 -
如果可能的话,你可以做一些批量插入到一个临时表。 这一定程度上取决于你的RDBMS /主机的语言,但在最坏的情况这可以用一个简单的动态SQL(使用完成VALUES()子句),然后一个标准的更新-从-另一个表。 大多数系统批量加载提供实用工具,虽然

二 -
而这在某种程度上依赖于关系型数据库,以及,你可以建立一个动态更新语句。 在这种情况下,在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的语法,但我不能让它在小提琴工作)



Answer 2:

是的,你可以做到这一点,但我怀疑这会提高性能,除非你的查询有一个真正的大的延迟。

你可以这样做:

 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_QUERIES *(COST_QUERY_SETUP + COST_QUERY_PERFORMANCE)。 这样一来,你击倒在NUM_QUERIES了一点,但COST_QUERY_PERFORMANCE上升BIGTIME。 如果COST_QUERY_SETUP真的是巨大的(例如,你调用一些网络服务,这是真正的慢),那么,是的,你可能仍然结束了在上面。

否则,我会用索引的ID,或修改架构尝试。

在MySQL中,我认为你可以用多个INSERT对重复密钥更新这样做更容易(但我不知道,没试过)。



Answer 3:

像这样的东西可能会为你工作:

"UPDATE myTable SET ... ;
 UPDATE myTable SET ... ;
 UPDATE myTable SET ... ;
 UPDATE myTable SET ... ;"

如果任何POSX或波西值是相同的,那么它们可以合并成一个查询

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


Answer 4:

以“更新平板尝试集(行= '值' 其中id = 0001 '),(行=' 值' 其中id = 0002' ),...



文章来源: Update multiple rows with different values in a single SQL query
标签: sql sqlite rows