Условие
В базе address есть таблица a. В некоторых строках поле [кодТТВх] равно NULL (таких строк 6353). Требуется написать SQL для заполнения этого поля. Возможно, поможет таблица b.
Решение
Подход
- Понять связь: какой ключ связывает
aиbтак, чтобыb.[кодТТВх]был известен. - Если ключ —
id_addressилиaddress_string— выполнитьUPDATE ... FROM(Postgres) илиUPDATE ... JOIN(MySQL/SQL Server).
PostgreSQL
UPDATE address.a AS a
SET "кодТТВх" = b."кодТТВх"
FROM address.b AS b
WHERE a.id = b.id -- предполагаемая связь
AND a."кодТТВх" IS NULL
AND b."кодТТВх" IS NOT NULL;MySQL
UPDATE address.a a
JOIN address.b b ON b.id = a.id
SET a.кодТТВх = b.кодТТВх
WHERE a.кодТТВх IS NULL AND b.кодТТВх IS NOT NULL;SQL Server
UPDATE a
SET кодТТВх = b.кодТТВх
FROM address.a a
INNER JOIN address.b b ON b.id = a.id
WHERE a.кодТТВх IS NULL AND b.кодТТВх IS NOT NULL;Если связь по адресу/нечёткая
UPDATE address.a a
SET "кодТТВх" = b."кодТТВх"
FROM address.b b
WHERE a."кодТТВх" IS NULL
AND b.region = a.region
AND b.city = a.city
AND b.street = a.street
AND (
SELECT COUNT(*) FROM address.b b2
WHERE b2.region=a.region AND b2.city=a.city AND b2.street=a.street
AND b2."кодТТВх" IS NOT NULL
) = 1; -- однозначное соответствиеSanity-check после UPDATE
SELECT COUNT(*) FROM address.a WHERE "кодТТВх" IS NULL; -- должно убавитьсяПодводные камни
- Не делайте UPDATE без
WHEREиIS NULL— затрёте уже корректные значения. - Если
bсодержит дубликаты по ключу,UPDATE FROMв Postgres возьмёт произвольную строку → недетерминированно. Нужно агрегировать или фильтровать дубли. - Перед прод-апдейтом —
BEGIN; ... ROLLBACK;для проверки илиSELECTс тем жеJOIN. - Бэкап:
CREATE TABLE a_backup AS SELECT * FROM a; - Если в
bтоже есть пропуски —IS NOT NULLобязательно.
Эталонный ответ
UPDATE a SET кодТТВх = b.кодТТВх FROM b WHERE a.<key>=b.<key> AND a.кодТТВх IS NULL AND b.кодТТВх IS NOT NULL; — синтаксис зависит от СУБД.