使用SQLite加入更新

Car*_*ter 38 sqlite

我有2个表,喜欢用另一个表中的值更新其中一个表.

software
---------
id ,
purchprice

softwarecost
------------
id ,
purchprice
Run Code Online (Sandbox Code Playgroud)

我已经尝试过这些查询,但是,SQLite不支持JOIN和UPDATE.anybody,可以为此提出查询.谢谢你的帮助.

UPDATE software 
SET software.purchprice=softwarecost.purchprice 
WHERE software.id=softwarecost.id

UPDATE software 
INNER JOIN softwarecost on software.id=softwarecost.id 
SET software.purchprice=softwarecost.purchprice 
Run Code Online (Sandbox Code Playgroud)

Dur*_*n.H 52

这会奏效

UPDATE 
      software
SET purchprice = (SELECT purchprice
                  FROM softwarecost
                  WHERE id = software.id) 
where EXISTS (SELECT purchprice
                  FROM softwarecost
                  WHERE id = software.id)
Run Code Online (Sandbox Code Playgroud)

这里我们使用exists,因为如果没有找到"相关"行,查询将把software.purchprice设置为null.

  • 自 v3.33(2020 年 8 月 14 日发布)起,sqlite 支持 UPDATE FROM 语法:https://www.sqlite.org/lang_update.html#upfrom (4认同)

CL.*_*CL. 35

您必须使用相关子查询查找相应的值:

UPDATE software
SET purchprice = (SELECT purchprice
                  FROM softwarecost
                  WHERE id = software.id)
Run Code Online (Sandbox Code Playgroud)

  • 我刚试过这个.整个表软件中的字段purchprice将具有相同的值.它不会加入. (6认同)
  • @Colin'tHart这似乎是理想的行为,不是吗? (4认同)
  • 但请注意,这会将`software.purchprice`设置为`null`,而`softwarecost`中找不到"相关"行. (3认同)

Jan*_*erk 20

使用新的 UPDATE FROM 语法,该语法是根据 Pelle Jacobs 在评论中建议的 v3.33(2020 年 8 月 14 日发布)中引入的。

UPDATE software
SET purchprice = c.purchprice
FROM (SELECT purchprice, id FROM softwarecost) AS c
WHERE c.id = software.id;
Run Code Online (Sandbox Code Playgroud)


Vas*_*i P 7

这个声明会好起来的!

它只会更新'softwarecost'中具有相同ID的'software'中的行!

UPDATE software SET software.purchprice = 
     (SELECT purchprice FROM softwerecost WHERE software.id = softwerecost.id) 
     WHERE id IN (SELECT id FROM softwarecost);
Run Code Online (Sandbox Code Playgroud)

还有一种方法:

DELETE FROM software WHERE id IN (SELECT id FROM softwarecost);
INSERT INTO software SELECT * FROM softwarecost;
Run Code Online (Sandbox Code Playgroud)

...如果您必须更新所有列(如果您有更多列要更新),这种方式会更方便


小智 6

我刚刚使用UPSERT找到了这个:

INSERT INTO software (id, purchprice)
SELECT a.id, b.purchprice FROM software AS a INNER JOIN softwarecost AS b ON a.id=b.id
ON CONFLICT(id) DO UPDATE SET purchprice=excluded.purchprice
Run Code Online (Sandbox Code Playgroud)

这只有在你有的情况下才有效

  • SQLite 版本 3.24.0 或更高版本以及
  • 对 software.id 的唯一约束,例如将其定义为主键。

它不需要可能很慢的相关子查询,并且可以处理多个列更新。


小智 5

这里的其他答案大多是正确的,但需要稍作修改。至少我确实需要做出改变才能使其发挥作用。不确定这是多年来对 SQLite 发生的更改还是只是从未在此处捕获,但您需要完全限定子句中id对列的引用,而不仅仅是。如果不这样做,我刚刚运行的查询会使所有条目具有相同的值,并且它是链接的第一个值 - 意味着 的所有条目都与 中的第一个条目相同。我认为,这是由于 id 列不明确(如果它只是“id=software.id”),从而链接到其自身。softwarecostWHEREWHERE softwarecost.id = software.idWHERE id = software.idsoftware.purchpricesoftwarecost.purchprice

UPDATE 
      software
SET purchprice = (SELECT purchprice
                  FROM softwarecost
                  WHERE softwarecost.id = software.id) 
where EXISTS (SELECT purchprice
                  FROM softwarecost
                  WHERE softwarecost.id = software.id)
Run Code Online (Sandbox Code Playgroud)


Bog*_*rym -3

这里没有 JOIN:

UPDATE software
SET software.purchprice=softwarecost.purchprice
WHERE software.id=softwarecost.id
Run Code Online (Sandbox Code Playgroud)

这是行不通的:

UPDATE software s INNER JOIN softwarecost sc on s.id=sc.id
SET s.purchprice=sc.purchprice 
Run Code Online (Sandbox Code Playgroud)

SQLite 确实不支持 UPDATE 查询中的 JOIN http://sqlite.org/lang_update.html

使用 REPLACE 怎么样?
也许你可以:

REPLACE INTO software
SELECT id, purchprice
FROM softwarecost
Run Code Online (Sandbox Code Playgroud)