64

我有 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 
4

11 回答 11

84

这将起作用

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。

于 2014-01-12T12:33:49.567 回答
45

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

UPDATE software
SET purchprice = (SELECT purchprice
                  FROM softwarecost
                  WHERE id = software.id)
于 2013-10-09T11:49:38.180 回答
9

这个声明会很好用!

它将仅更新“softwarecost”中具有相同 ID 的“software”中的行!

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;

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

于 2015-03-15T19:07:07.057 回答
5

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

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

于 2020-02-28T19:31:03.023 回答
4

这里的其他答案大多是正确的,但需要稍作改动。至少我当然需要对其进行更改才能使其正常工作。不确定这是否是多年来发生的对 SQLite 的更改,或者只是它从未在这里被捕获,但您需要完全限定id从子句中softwarecost对column 的引用,而不是 just 。如果不这样做,我刚刚运行的查询使所有条目都具有相同的值,并且它是第一个链接的值 - 这意味着 的所有条目都与. 我认为这是由于 id 列不明确,如果它只是“id=software.id”并因此链接到自身。WHEREWHERE 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)
于 2021-02-27T00:55:37.740 回答
4

我知道这很旧,但我更喜欢

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

它可以作为 UPDATE with JOINs 问题的通用解决方案,并且使 SQLite 不必执行第二个 SELECT 语句来验证子查询中是否确实存在一行。

于 2019-11-20T14:49:00.683 回答
1

卡特,“s”附近的 >> 的问题:语法错误<< 是关于 ALIAS 的使用。UPDATE 命令不接受 ALIAS。如果您尝试有关 REPLACE 的 bogdan 提示,您可以在 SELECT 子句中进行连接。

于 2014-01-09T11:17:50.987 回答
1

使用 Pelle Jacobs 在评论中建议的新的 UPDATE FROM 语法。

UPDATE software
SET purchprice = c.purchprice
FROM (SELECT purchprice FROM softwarecost) AS c
WHERE c.id = software.id;
于 2021-11-03T20:48:47.773 回答
0
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 条件更新什么

于 2021-10-16T14:03:59.120 回答
-2

你可以试试,

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)
于 2019-08-24T06:59:18.300 回答
-3

这里没有 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
于 2013-10-09T11:08:25.980 回答