【问题标题】:Update table for all entries from select statement更新 select 语句中所有条目的表
【发布时间】:2013-11-23 15:30:13
【问题描述】:

在我的场景中,我从条件为真的表中选择所有条目,将其放入向量中并通过循环使用更新语句,传递向量的值。它有效。

SELECT * FROM MAP AS A WHERE EXISTS  
(SELECT (X, Y) FROM MAP AS B WHERE B.X = A.X + 1 AND B.Y = A.Y ) AND EXISTS     
(SELECT (X, Y) FROM MAP AS C WHERE C.X = A.X - 1 AND C.Y = A.Y ) ;

for...
UPDATE MAP SET VAL = 2 WHERE X = ? AND Y = ?; 
...

但我想尝试使用单个语句来完成此目标,虽然我们可以使用 select 语句更新表,但在我的场景中,在选择记录之前需要检查 2 个键,所以我不是能够将 x 或 y 的 where 条件放在一起。

UPDATE MAP SET USED = 1 WHERE EXISTS (
SELECT * FROM MAP AS A WHERE EXISTS  
(SELECT (X, Y) FROM MAP AS B WHERE B.X = A.X + 1 AND B.Y = A.Y ) AND EXISTS     
(SELECT (X, Y) FROM MAP AS C WHERE C.X = A.X - 1 AND C.Y = A.Y ) );

当我像上面那样设置 where 存在条件时,它会更新所有条目。如何在一个查询中更新表?

【问题讨论】:

  • SELECT (X, Y) ... 不是有效的 SQL。
  • 是的,我将 * 替换为 (X, Y) 为语句提供一些上下文。

标签: sql sqlite


【解决方案1】:

您的子查询的问题在于它没有在 UPDATE 语句中引用表 (MAP)。

只需删除MAP AS A 子查询并直接引用MAPUPDATE 不允许表别名):

UPDATE MAP
SET USED = 1
WHERE EXISTS (SELECT 1 FROM MAP AS B WHERE B.X = MAP.X + 1 AND B.Y = MAP.Y)
  AND EXISTS (SELECT 1 FROM MAP AS C WHERE C.X = MAP.X - 1 AND C.Y = MAP.Y)

【讨论】:

  • 在那些 select 语句中使用 1 或 X, Y 有什么区别吗?
  • EXISTS 仅检查某些记录是否存在,而不检查其中的内容。
【解决方案2】:

由于您已验证子查询正在返回您要更新的行,因此您的更新应如下所示:

UPDATE MAP SET USED = 1 
WHERE (X,Y) IN (
SELECT X, Y FROM MAP AS A WHERE EXISTS  
(SELECT X, Y FROM MAP AS B WHERE B.X = A.X + 1 AND B.Y = A.Y ) AND EXISTS     
(SELECT X, Y FROM MAP AS C WHERE C.X = A.X - 1 AND C.Y = A.Y ) );

【讨论】:

  • 我在 SQlite Manager 中尝试了这段代码,它显示以下错误消息“near”,“:语法错误”。
  • 你是对的 - 看起来 sqllite 不支持元组语法。它也不支持更新连接。让我看看有没有别的办法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
相关资源
最近更新 更多