我有表SQLite数据库myTable和列id,posX,posY.行数不断变化(可能会增加或减少).如果我知道的值id的每一行,并且行数,我可以执行一个SQL查询来更新所有的posX,并posY根据ID不同值的字段?
例如:
---------------------
myTable:
id posX posY
1 35 565
3 89 224
6 11 456
14 87 475
---------------------
Run Code Online (Sandbox Code Playgroud)
SQL查询伪代码:
UPDATE myTable SET posX[id] = @arrayX[id], posY[id] = @arrayY[id] "
Run Code Online (Sandbox Code Playgroud)
@arrayX并且@arrayY是存储posX和posY字段的新值的数组.
如果,例如,arrayX和arrayY包含以下值:
arrayX = { 20, 30, 40, 50 }
arrayY = { 100, 200, 300, 400 }
Run Code Online (Sandbox Code Playgroud)
...然后查询后的数据库应如下所示:
---------------------
myTable:
id posX posY
1 20 100
3 30 200
6 40 300
14 50 400
---------------------
Run Code Online (Sandbox Code Playgroud)
这可能吗?我现在正在为每个查询更新一行,但随着行数的增加,它将需要数百个查询.顺便说一下,我正在Air中做这一切.
Clo*_*use 26
有一对夫妇的方式来做到这一点体面有效.
首先 -
如果可能,您可以对临时表进行某种批量插入.这在某种程度上取决于您的RDBMS /宿主语言,但最糟糕的是,这可以通过简单的动态SQL(使用VALUES()子句),然后是标准的从另一个表更新来实现.但是,大多数系统都提供批量加载的实用程序
第二 -
这也有点依赖于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)
Run Code Online (Sandbox Code Playgroud)
(根据文档,这应该是有效的SQLite语法,但我不能让它在小提琴中工作)
LSe*_*rni 17
是的,你可以这样做,但我怀疑它会提高性能,除非你的查询有一个真正的大延迟.
你可以这样做:
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]...);
Run Code Online (Sandbox Code Playgroud)
总费用或多或少由:NUM_QUERIES*(COST_QUERY_SETUP + COST_QUERY_PERFORMANCE).通过这种方式,您可以在NUM_QUERIES上点击一下,但COST_QUERY_PERFORMANCE会大幅提升.如果COST_QUERY_SETUP真的很大(例如,你正在调用一些非常慢的网络服务),那么,是的,你可能仍然最终处于领先地位.
否则,我会尝试对id进行索引或修改体系结构.
在MySQL中,我认为你可以通过多次INSERT ON DUPLICATE KEY UPDATE更容易地做到这一点(但我不确定,从未尝试过).
这样的事可能适合你:
"UPDATE myTable SET ... ;
UPDATE myTable SET ... ;
UPDATE myTable SET ... ;
UPDATE myTable SET ... ;"
Run Code Online (Sandbox Code Playgroud)
如果任何posX或posY值相同,则它们可以组合成一个查询
UPDATE myTable SET posX='39' WHERE id IN('2','3','40');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
83995 次 |
| 最近记录: |