使用SQLite加入更新

时间:2013-10-09 11:03:36

标签: sqlite

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

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

softwarecost
------------
id ,
purchprice

我已经尝试过这些查询但是,SQLite不支持使用UPDATE.anybody的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 

9 个答案:

答案 0 :(得分:44)

这将有效

UPDATE 
      software
SET purchprice = (SELECT purchprice
                  FROM softwarecost
                  WHERE id = software.id) 
where EXISTS (SELECT purchprice
                  FROM softwarecost
                  WHERE id = software.id)

这里我们使用存在因为 如果没有找到“相关”行,则查询会将software.purchprice设置为null。

答案 1 :(得分:32)

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

UPDATE software
SET purchprice = (SELECT purchprice
                  FROM softwarecost
                  WHERE id = software.id)

答案 2 :(得分:6)

此声明可以正常使用!

它只会更新'软件'中的行。在' 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;

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

答案 3 :(得分:3)

我刚刚使用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的唯一约束,例如通过将其定义为主键。

它不需要潜在的慢速关联子查询,并且可以处理多个列更新。

答案 4 :(得分:2)

Carter,问题>> 靠近“s”:语法错误<<是关于使用ALIAS。 UPDATE命令不接受ALIAS。如果你尝试了关于REPLACE的bogdan技巧,你可以加入SELECT子句。

答案 5 :(得分:1)

我知道这很老,但是我更喜欢

UPDATE software
SET purchprice = IFNULL( (SELECT purchprice
                          FROM softwarecost
                          WHERE id = software.id), purchprice) 

它可作为带有JOINs的UPDATE问题的常规解决方案,并节省了SQLite必须执行第二条SELECT语句以验证子查询中确实存在一行的情况。

答案 6 :(得分:1)

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

softwarecost.purchprice

答案 7 :(得分:-1)

这里没有加入:

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查询http://sqlite.org/lang_update.html

中确实不支持JOIN

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

REPLACE INTO software SELECT id, purchprice FROM softwarecost

答案 8 :(得分:-1)

您可以尝试尝试

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)