Я написал ниже запрос для обновления таблицы mysql
update table1
set val_col = 'TRUE'
where id IN(
SELECT ID
FROM table1 a INNER JOIN
table2 b
ON a.a_id = b.a_id
WHERE a.create_dt >= '2017-01-07' AND
b.check_status = 'FAIL' AND
b.check_type = 'check1' AND
b.timestamp_val = (SELECT MAX(b2.timestamp_val)
FROM table2 b2
WHERE b2.a_id = b.a_id AND
b2.check_status = b.check_status AND
b2.check_type = b.check_type
));
Я получаю сообщение об ошибке
You can't specify target table 'table1' for update in FROM clause
Ошибка довольно ясна, что говорит, вы пытаетесь обновить table1
но table1
также используется в предложении where. Итак, создавая внутренний выбор и наложение, он должен делать трюк;
update table1
set val_col = 'TRUE'
where id IN(
select * from (
SELECT ID
FROM table1 a INNER JOIN
table2 b
ON a.a_id = b.a_id
WHERE a.create_dt >= '2017-01-07' AND
b.check_status = 'FAIL' AND
b.check_type = 'check1' AND
b.timestamp_val = (SELECT MAX(b2.timestamp_val)
FROM table2 b2
WHERE b2.a_id = b.a_id AND
b2.check_status = b.check_status AND
b2.check_type = b.check_type
)) aliasTable1);
Просто используйте JOIN
:
UPDATE table1 t1 JOIN
(SELECT ID
FROM table1 a INNER JOIN
table2 b
ON a.a_id = b.a_id
WHERE a.create_dt >= '2017-01-07' AND
b.check_status = 'FAIL' AND
b.check_type = 'check1' AND
b.timestamp_val = (SELECT MAX(b2.timestamp_val)
FROM table2 b2
WHERE b2.a_id = b.a_id AND
b2.check_status = b.check_status AND
b2.check_type = b.check_type
)
) tt
ON t1.id = tt.id
set t1.val_col = 'TRUE';
Я подозреваю, что вы также можете упростить логику.