是否可以通过添加SQLite中其他两个表的值来更新表

时间:2019-03-24 11:24:34

标签: sqlite

我正在尝试SQLite并遇到问题。有3个表A,B和C。 我想使用B和C的总和来更新表A。

表A. 詹姆斯为空。

表B. 詹姆斯5。

表C 詹姆斯2

因此,通过更新,我希望表A具有

詹姆斯3.(5-2)

谢谢

3 个答案:

答案 0 :(得分:1)

我相信以下内容表明,您可以:-

DROP TABLE IF EXISTS ta;
DROP TABLE IF EXISTS tb;
DROP TABLE IF EXISTS tc;
CREATE TABLE IF NOT EXISTS ta (name TEXT, numb INTEGER);
CREATE TABLE IF NOT EXISTS tb (name TEXT, numb INTEGER);
CREATE TABLE IF NOT EXISTS tc (name TEXT, numb INTEGER);
INSERT INTO ta VALUES ('JAMES',null),('Mary',100);
INSERT INTO tb VALUES ('JAMES',5),('Sue',33);
INSERT INTO tc VALUES ('JAMES',2),('Anne',45);

UPDATE ta SET numb = 
    (SELECT sum(numb) FROM tb WHERE name = 'JAMES') 
    - 
    (SELECT sum(numb) FROM tc WHERE name = 'JAMES') 
WHERE name = 'JAMES';

SELECT * FROM ta;
SELECT * FROM tb;
SELECT * FROM tc;

此:-

  • 如果存在表,则将其拖放以允许其重新运行(在需要时简化了修改)。
      假设
    • 列名 name numb 因为没有给出
  • 创建3个表(用于演示的笔记表名称为ta,tb和tc
  • 添加一些数据(请注意,已添加其他行以显示如何区分(至少是一种方式)
  • 更新表A(ta)中的列 numb ,其中name列的值根据所有具有相同名称的行中numb列的总和而得出 JAMES 表tb中的(JAMES)减去表tc中所有具有相同名称(JAMES)的行中numb列的总和
    • 这可能与您想要的不完全一样,因此它假定您要对每个表(ta和tc)具有相同名称的所有行求和
  • 查询所有表(下面显示的是第一个,因为这是已更新的表。)

第一个结果显示该行已从null更新为3(5-2),并且Mary的行保持不变:-

enter image description here

对UPDATE进行的以下更改将获得名称(而不是按照ta表中提取的行多次对“ JAMES”进行硬编码,使用硬编码名称可能会使它更名更容易理解SQL的工作)。

UPDATE ta SET numb = (SELECT sum(numb) FROM tb WHERE name = ta.name) - (SELECT sum(numb) FROM tc WHERE name = ta.name) WHERE name = 'JAMES';

请注意,如果在tb或tc中都没有关联的行(即,具有相同名称的行),那么结果将为null(无论是否使用sum)。

答案 1 :(得分:1)

SQLite 不支持UPDATE语句中的联接,因此您可以通过直接访问表AB的相应行来做到这一点:

update A 
set value = 
  (select value from B where name = A.name) -
  (select value from C where name = A.name)

如果您只想用name = 'James'更新行,请添加:

where name = 'James'

请参见demo

答案 2 :(得分:0)

在每个数据库中工作:

UPDATE 
  "A" 
SET
  "x" = 
    (
      SELECT
        SUM("x")
      FROM "B"
        WHERE "B"."id"="A"."id"
    ) +
    (
      SELECT
        SUM("x")
      FROM "C"
        WHERE "C"."id"="A"."id"
    )