我有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.
CL.*_*CL. 35
您必须使用相关子查询查找相应的值:
UPDATE software
SET purchprice = (SELECT purchprice
FROM softwarecost
WHERE id = software.id)
Run Code Online (Sandbox Code Playgroud)
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)
这个声明会好起来的!
它只会更新'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)
这只有在你有的情况下才有效
它不需要可能很慢的相关子查询,并且可以处理多个列更新。
小智 5
这里的其他答案大多是正确的,但需要稍作修改。至少我确实需要做出改变才能使其发挥作用。不确定这是多年来对 SQLite 发生的更改还是只是从未在此处捕获,但您需要完全限定子句中id
对列的引用,而不仅仅是。如果不这样做,我刚刚运行的查询会使所有条目具有相同的值,并且它是链接的第一个值 - 意味着 的所有条目都与 中的第一个条目相同。我认为,这是由于 id 列不明确(如果它只是“id=software.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)
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)
归档时间: |
|
查看次数: |
41634 次 |
最近记录: |