У меня нет опыта работы с SQLite
, но я попробовал вашу проблему.
Как вы уже сказали, невозможно обновить более одной таблицы одновременно (насколько мне известно, решение , предоставляемое Tristran , работает только для MySQL
.
Сначала я обновляю t1
и устанавливаю sts=1
для каждой строки (если затронуто только несколько строк, может быть более эффективно добавить условие WHERE
для получения соответствующих строк) и rowid_t2
t2.rowid
, где все соответствующие столбцы совпадают.
UPDATE t1
SET
sts = 1,
rowid_t2 = (
SELECT rowid FROM t2
WHERE t2.f1 = t1.f1 AND t2.f2 = t1.f2 AND t2.f3 = t1.f3
);
Затем я делаю то же самое с sts=2
и sts=3
, но только там, где rowid_t2
еще не установлено.
UPDATE t1
SET
sts = 2,
rowid_t2 = (
SELECT rowid FROM t2
WHERE t2.f1 = t1.f1 AND t2.f2 = t1.f2
)
WHERE t1.rowid_t2 IS NULL;
UPDATE t1
SET
sts = 3,
rowid_t2 = (
SELECT rowid FROM t2
WHERE t2.f1 = t1.f1
)
WHERE t1.rowid_t2 IS NULL;
Затем я сбрасываю t1.sts
, которые были установлены на 3
, но на самом деле не действительны:
UPDATE t1
SET sts = NULL
WHERE rowid_t2 IS NULL;
И, наконец, я обновляю sts
в t2
до "самого низкого" метода, который соответствовал t1
. Поэтому, если строка в t2
имеет одну строку в t1
, которая соответствует всем критериям, и строку, которая соответствует только для f1
, я все равно устанавливаю sts=1
.
UPDATE t2
SET sts = (
SELECT MIN(sts)
FROM t1
WHERE t1.rowid_t2 = t2.rowid
)
Я не пробовал с индексами, но я думаю, что вы должны иметь один для t2.f1
, t2.f2
и t2.f3
для первых трех обновлений (могут потребоваться отдельные индексы с SQLite
, не уверен), а другой один в t1.rowid_t2
для двух других обновлений и для t1.rowid_t2 IS NULL
.
Сначала попробуйте использовать некоторые репрезентативные тестовые данные, чтобы убедиться, что результат соответствует ожидаемому и производительность в порядке.
Удачи:)