提问人:Carter 提问时间:10/9/2013 最后编辑:ArulkumarCarter 更新时间:8/16/2023 访问量:90311
在 SQLite 中使用 Join 进行更新
Update with Join in SQLite
问:
我有 2 个表,并希望用另一个表的值更新其中一个表。
software
---------
id ,
purchprice
softwarecost
------------
id ,
purchprice
我已经尝试了这些查询,但是,SQLite不支持带有UPDATE.JOINS的任何人,任何人都可以提出查询,感谢您的帮助。
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
答:
这里没有 JOIN:
UPDATE software
SET software.purchprice=softwarecost.purchprice
WHERE software.id=softwarecost.id
这是行不通的:
UPDATE software s INNER JOIN softwarecost sc on s.id=sc.id
SET s.purchprice=sc.purchprice
SQLite确实不支持UPDATE查询中的JOIN http://sqlite.org/lang_update.html
使用REPLACE怎么样?
也许你可以:
REPLACE INTO software
SELECT id, purchprice
FROM softwarecost
评论
您必须使用相关的子查询查找相应的值:
UPDATE software
SET purchprice = (SELECT purchprice
FROM softwarecost
WHERE id = software.id)
评论
software.purchprice
null
softwarecost
WHERE
Error: no such column: software.id
Carter,>>near “s”: syntax error<<的问题与ALIAS的使用有关。UPDATE 命令不接受 ALIAS。如果你尝试关于REPLACE的bogdan提示,你可以加入到SELECT子句中。
这将起作用
UPDATE
software
SET purchprice = (SELECT purchprice
FROM softwarecost
WHERE id = software.id)
where EXISTS (SELECT purchprice
FROM softwarecost
WHERE id = software.id)
这里我们使用 exist,因为 否则,如果未找到“相关”行,则查询会将 Software.PurchPrice 设置为 null。
评论
这个声明会很好用!
它只会更新“software”中在“softwarecost”中具有相同 ID 的行!
UPDATE software SET software.purchprice =
(SELECT purchprice FROM softwerecost WHERE software.id = softwerecost.id)
WHERE id IN (SELECT id FROM softwarecost);
还有一种方法:
DELETE FROM software WHERE id IN (SELECT id FROM softwarecost);
INSERT INTO software SELECT * FROM softwarecost;
...如果您必须更新所有列(如果您有更多列要更新),这种方式会更方便
您可以尝试给定的,
UPDATE software SET purchprice = (SELECT purchprice FROM softwarecost a WHERE a.id =software.id) where purchprice IN(SELECT distinct(purchprice) FROM softwarecost a WHERE a.id = software.id)
我知道这很旧,但我更喜欢
UPDATE software
SET purchprice = IFNULL( (SELECT purchprice
FROM softwarecost
WHERE id = software.id), purchprice)
它可以作为UPDATE with JOINs问题的一般解决方案,并节省SQLite必须执行第二个SELECT语句来验证子查询中是否确实有一行。
评论
我刚刚找到了这个,使用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
这仅在您有以下情况时有效
- SQLite 版本 3.24.0 或更高版本,以及
- 对 software.id 的唯一约束,例如将其定义为主键。
它不需要可能缓慢的相关子查询,并且可以处理多个列更新。
评论
这里的其他答案大多是正确的,但需要稍作更改。至少我当然需要做出改变才能让它发挥作用。不确定这是多年来对SQLite的更改,还是只是它从未在这里被发现,但是您需要从子句中完全限定对列的引用,而不仅仅是.如果不这样做,我刚刚运行的查询使所有条目都具有相同的值,并且它是链接的第一个值 - 这意味着 的所有条目都变得与 中的第一个条目相同。我认为,这是由于 id 列是模棱两可的,如果它只是“id=software.id”,因此它本身就有链接。id
softwarecost
WHERE
WHERE softwarecost.id = software.id
WHERE id = software.id
software.purchprice
softwarecost.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)
Update software
set Column1 = anyValue
where id in (Select sf.id from software sf join softwarecost sfc on sf.id=sfc.id
where sfc.purchprice='anyValue'
)
如果您要更新的内容与 Join 和 Where 条件
使用 v3.33(2020 年 8 月 14 日发布)中引入的新 UPDATE FROM 语法,正如 Pelle Jacobs 在评论中建议的那样。
UPDATE software
SET purchprice = c.purchprice
FROM (SELECT purchprice, id FROM softwarecost) AS c
WHERE c.id = software.id;
评论