MYSQL: ошибка при обновлении таблицы

0

Я написал ниже запрос для обновления таблицы 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

Теги:
select
sql-update
join

2 ответа

1
Лучший ответ

Ошибка довольно ясна, что говорит, вы пытаетесь обновить 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);
0

Просто используйте 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';

Я подозреваю, что вы также можете упростить логику.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню