Можно ли обновить таблицу, добавив значения из двух других таблиц в SQLite - PullRequest
0 голосов
/ 24 марта 2019

Я пробую SQLite и столкнулся с проблемой. Есть 3 таблицы A, B и C. Я хочу обновить таблицу A, используя сумму B и C.

Таблица А. Джеймс Нуль.

Таблица Б. Джеймс 5.

Таблица C Джеймс 2

поэтому с обновлением я хочу, чтобы таблица A имела

Джеймс 3. (5-2)

Спасибо

Ответы [ 3 ]

1 голос
/ 24 марта 2019

Я полагаю, что следующее демонстрирует, что Да Вы можете: -

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;

Это: -

  • Удаляет таблицы, если они существуют, что позволяет их повторно запускать ( упрощает модификации, если необходимо ).
    • имена столбцов имя и онемение были приняты, поскольку им не было дано .
  • Создает 3 таблицы ( имена таблиц примечаний, используемые для демонстрации: ta, tb и tc )
  • Добавляет некоторые данные ( обратите внимание, что были добавлены дополнительные строки, чтобы показать, как отличить (по крайней мере, от моды) )
  • Обновляет столбец numb таблицы A (ta), где столбец имени имеет значение JAMES в соответствии с суммой столбца numb из всех строк с одинаковым именем (JAMES) ) из таблицы tb минус сумма нечувствительного столбца из всех строк с одинаковым именем (JAMES) из таблицы tc
    • Возможно, это не совсем то, что вам нужно, поэтому предполагается, что вы хотите суммировать все строки с одинаковыми именами в таблице (ta и tc)
  • Запрашивает все таблицы (первая показана ниже, так как это таблица, которая была обновлена.)

Первый результат, показывающий, что строка была обновлена ​​с нуля до 3 (5 - 2) и что строка для Мэри осталась такой, какой она была: -

enter image description here

Следующее изменение в ОБНОВЛЕНИИ получает имя (вместо жесткого кодирования 'JAMES' несколько раз, согласно извлеченным строкам из таблицы ta, использование жестко закодированных имен, возможно, делает его проще понять работу 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 не будет связанной строки (то есть с одинаковым именем), то результат будет нулевым (независимо от того, используется ли сумма).

1 голос
/ 24 марта 2019

SQLite не поддерживает объединения в операторе UPDATE, поэтому вы можете сделать это, непосредственно обращаясь к соответствующим строкам таблиц A и B следующим образом:

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'

См. Демоверсию

0 голосов
/ 24 марта 2019

Работает в каждой БД:

UPDATE 
  "A" 
SET
  "x" = 
    (
      SELECT
        SUM("x")
      FROM "B"
        WHERE "B"."id"="A"."id"
    ) +
    (
      SELECT
        SUM("x")
      FROM "C"
        WHERE "C"."id"="A"."id"
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...