Один из способов сделать это можно с помощью набора коррелированных подзапросов, по одному для каждого столбца, который нужно найти. Мы используем COALESCE
, так что если значение не найдено, мы сохраняем предыдущее значение:
UPDATE products p
SET color_id = COALESCE((SELECT id FROM filters WHERE filter_name = p.color_id), color_id),
size_id = COALESCE((SELECT id FROM filters WHERE filter_name = p.size_id), size_id),
composition_id = COALESCE((SELECT id FROM filters WHERE filter_name = p.composition_id), composition_id)
Тогда вы можете SELECT * FROM products
:
id name color_id size_id composition_id
1 Test 1 22 61
2 Test2 2 23 62
Демонстрация на dbfiddle
Вы также можете достичь того же результата с помощью запроса UPDATE ... JOIN
, который может быть более эффективным:
UPDATE products p
LEFT JOIN filters f1 ON f1.filter_name = p.color_id
LEFT JOIN filters f2 ON f2.filter_name = p.size_id
LEFT JOIN filters f3 ON f3.filter_name = p.composition_id
SET color_id = COALESCE(f1.id, color_id),
size_id = COALESCE(f2.id, size_id),
composition_id = COALESCE(f3.id, composition_id)
Демонстрация по dbfiddle