Обновление Sqlite не влияет на все строки при использовании подзапроса - PullRequest
2 голосов
/ 26 июня 2019

На основании этого ответа Я пытаюсь обновить столбец в таблице b на основе значений из таблицы a, где таблица b имеет внешний ключ к таблице a. Мой запрос успешно выполняется и работает должным образом для строк, на которые он влияет. Тем не менее, это не влияет на все строки, и я не понимаю, почему. Кажется, он влияет только на три строки, независимо от размера базы данных.

Вот воспроизводимый пример:

CREATE TABLE a ( qty1 INTEGER, qty2 INTEGER, aID INTEGER PRIMARY KEY)WITHOUT ROWID;

CREATE TABLE b ( bID INTEGER, aID INTEGER,FOREIGN KEY(aID) REFERENCES a(aID) ON DELETE CASCADE);

INSERT INTO a (qty1, qty2, aID) VALUES (0, 100, 1906250435150010797);

INSERT INTO a (qty1, qty2, aID) VALUES (100, 100, 1906250435150010798);

INSERT INTO a (qty1, qty2, aID) VALUES (0, 100, 1906250435150010799);

INSERT INTO b (bID, aID) VALUES (0, 1906250435150010797);

INSERT INTO b (bID, aID) VALUES (0, 1906250435150010798);

INSERT INTO b (bID, aID) VALUES (1, 1906250435150010798);

INSERT INTO b (bID, aID) VALUES (0, 1906250435150010799);

ALTER TABLE b ADD COLUMN SameQty INTEGER;

UPDATE b SET SameQty = 0 WHERE aID = (SELECT aID from a where qty1 != qty2);

UPDATE b SET SameQty = 1 WHERE aID = (SELECT aID from a where qty1 = qty2);

Ожидаемый результат:

enter image description here

Фактический результат:

enter image description here

Проверено на sqlite 3.26.0

Ответы [ 2 ]

2 голосов
/ 26 июня 2019

Вы используете подзапрос, который может возвращать более одной строки в скалярном контексте и выполняет "WHERE aID = (SELECT aID from a".Используйте IN вместо =.

UPDATE b SET SameQty = 0 WHERE aID IN (SELECT aID from a where qty1 != qty2);
UPDATE b SET SameQty = 1 WHERE aID IN (SELECT aID from a where qty1 = qty2);

db <> fiddle

2 голосов
/ 26 июня 2019

Ваше обновление:

UPDATE b SET SameQty = 0 WHERE aID = (SELECT aID from a where qty1 != qty2);

имеет подзапрос, который может возвращать несколько строк, но используется в контексте, где ожидается только одна строка. Я чувствую, что это должно вызвать ошибку, но если вы ее не видите, может быть, это просто выбор одной произвольной строки из результатов?

В любом случае, вы хотите IN:

UPDATE b SET SameQty = 0 WHERE aID IN (SELECT aID from a where qty1 != qty2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...