Обновите различные столбцы, используя внутреннее соединение - PullRequest
1 голос
/ 01 апреля 2020

Можно ли поместить эти 2 кода в одну строку кода? Что нужно изменить?

UPDATE table1 AS t1 INNER JOIN table2 AS t2 ON t1.id = t2.id SET t1.column2 = 1;
UPDATE table1 AS t1 INNER JOIN table3 AS t3 ON t1.id = t3.id SET t1.column3 = 1;

Спасибо.

1 Ответ

2 голосов
/ 01 апреля 2020

Да, это возможно, но это немного громоздко. В основном это два LEFT JOINS и несколько условных логик c:

UPDATE table1 t1
LEFT JOIN table2 t2 ON t2.id = t1.id
LEFT JOIN table3 t2 ON t3.id = t1.id
SET 
    t1.column2 = CASE WHEN t2.id IS NOT NULL THEN 1 ELSE t1.column2 END,
    t1.column3 = CASE WHEN t3.id IS NOT NULL THEN 1 ELSE t1.column3 END
WHERE t2.id IS NOT NULL OR t3.id IS NOT NULL

Вы также можете использовать EXISTS и соответствующие подзапросы:

UPDATE table1 t1
SET 
    t1.column2 = CASE
        WHEN EXISTS(SELECT 1 FROM table2 t2 WHERE t2.id = t1.id)
        THEN 1
        ELSE t1.column2
    END,
    t1.column3 = CASE
        WHEN EXISTS(SELECT 1 FROM table3 t3 WHERE t3.id = t1.id)
        THEN 1
        ELSE t1.column3
    END
WHERE 
    EXISTS(SELECT 1 FROM table2 t2 WHERE t2.id = t1.id)
    OR EXISTS(SELECT 1 FROM table3 t3 WHERE t3.id = t1.id)
...