MySQL — обновить родительскую таблицу на основе конкатенированного соединения

avatar
Beems
9 августа 2021 в 03:11
90
2
1

У меня есть таблица устаревших марок/моделей, которые объединены вместе, но я создал две новые таблицы с разными марками и моделями, которые я хотел бы использовать для обновления таблицы устаревших марок/моделей, чтобы облегчить обновления. Таблицы выглядят так:

===============================================   
| tb_legacy                                   |   
===============================================   
| f_makemodel          | f_makeID | f_modelID | 
|----------------------|----------|-----------|   
| CHEVROLET CAPRICE    |   NULL   |   NULL    |
| CHEVROLET 1500 TRUCK |   NULL   |   NULL    |   
| FORD MUSTANG         |   NULL   |   NULL    | 
-----------------------------------------------

=============================    =============================
| tb_makes                  |    | tb_models                 |
=============================    =============================
| f_makeID | f_makename     |    | f_modelID | f_modelname   |
-----------------------------    -----------------------------
|    1     | Chevrolet      |    |     1     | Caprice       |
|    2     | Ford           |    |     2     | 1500 Truck    |
-----------------------------    |     3     | Mustang       |
                                 -----------------------------

What I want to do is UPDATE the tb_legacy table with the f_makeID and f_modelID fields so that I end up with the tb_legacy field looking like this:

===============================================   
| tb_legacy                                   |   
===============================================   
| f_makemodel          | f_makeID | f_modelID | 
|----------------------|----------|-----------|   
| CHEVROLET CAPRICE    |    1     |     1     |
| CHEVROLET 1500 TRUCK |    1     |     2     |   
| FORD MUSTANG         |    2     |     3     | 
-----------------------------------------------

У меня есть скрипт SQL, показывающий запрос SELECT: https://www.db-fiddle.com/f/pSJiMHNJPB6pBLfYTMCHgX/6

Как создать запрос UPDATE для достижения желаемого результата?

РЕДАКТИРОВАТЬ:

Следующее иллюстрирует то, что я хочу сделать, но

UPDATE tb_legacy
SET tb_legacy.f_makeID = 
(
    SELECT tb_makes.f_makeID
    FROM tb_legacy, tb_makes, tb_models
    WHERE tb_legacy.f_makemodel = CONCAT(tb_makes.f_makename,' ',tb_models.f_modelname)
),
tb_legacy.f_modelID = 
(
    SELECT tb_models.f_modelID
    FROM tb_legacy, tb_makes, tb_models
    WHERE tb_legacy.f_makemodel = CONCAT(tb_makes.f_makename,' ',tb_models.f_modelname)
)

Но приведенный выше запрос возвращает следующую ошибку: Error: ER_UPDATE_TABLE_USED: You can't specify target table 'tb_legacy' for update in FROM clause

Источник

Ответы (2)

avatar
forpas
9 августа 2021 в 07:56
1

Вам нужно соединить tb_legacy с двумя другими таблицами следующим образом:

UPDATE tb_legacy lg
INNER JOIN tb_makes mk ON lg.f_makemodel LIKE CONCAT(mk.f_makename, ' ', '%')
INNER JOIN tb_models md ON lg.f_makemodel LIKE CONCAT('%', ' ', md.f_modelname)
SET lg.f_makeID = mk.f_makeID,
    lg.f_modelID = md.f_modelID

См. демонстрацию.

avatar
Mithu
9 августа 2021 в 03:22
0

Что-то вроде этого

 update tb_legacy 
 set f_makeID=t.f_makeID, f_modelID=l.f_modelID
 from tb_makes t
 join tb_legacy l
 ON tb_legacy.f_makemodel = CONCAT(t.f_makename,' ',l.f_modelname)
Beems
9 августа 2021 в 05:13
0

Я думаю, что это близко, но нам нужно СОЕДИНИТЬ tb_makes и tb_models, а не tb_makes с tb_legacy, а также СОЕДИНИТЬ таблицу tb_models.

forpas
9 августа 2021 в 08:52
0

@Beems, что вы подразумеваете под это близко. Это даже не запускается, потому что это не синтаксис MySql.

Beems
9 августа 2021 в 14:38
0

@forpas Я пытался быть милым, потому что это дало мне некоторые возможности для дальнейших исследований. И нет, это не я проголосовал за этот ответ.