MySQL - 基于串联 JOIN 更新父级 Table
MySQL - Update Parent Table Based on Concatenated JOIN
我有一个 table 的遗留 makes/models 连接在一起,但我已经构建了两个新的 table,它们具有我想使用的不同品牌和型号更新遗留 makes/models 的 table 以便更轻松地进行更新。 table 看起来像这样:
===============================================
| 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 |
-----------------------------
我想要做的是 UPDATE
tb_legacy
table 与 f_makeID
和 f_modelID
字段,这样我最终得到的 tb_legacy
字段如下所示:
===============================================
| tb_legacy |
===============================================
| f_makemodel | f_makeID | f_modelID |
|----------------------|----------|-----------|
| CHEVROLET CAPRICE | 1 | 1 |
| CHEVROLET 1500 TRUCK | 1 | 2 |
| FORD MUSTANG | 2 | 3 |
-----------------------------------------------
我有一个 SQL Fiddle 显示 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)
)
但是上面的查询returns出现如下错误:
Error: ER_UPDATE_TABLE_USED: You can't specify target table 'tb_legacy' for update in FROM clause
像这样
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)
您需要像这样将 tb_legacy
连接到其他 2 个表:
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
参见demo。
我有一个 table 的遗留 makes/models 连接在一起,但我已经构建了两个新的 table,它们具有我想使用的不同品牌和型号更新遗留 makes/models 的 table 以便更轻松地进行更新。 table 看起来像这样:
===============================================
| 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 |
-----------------------------
我想要做的是 UPDATE
tb_legacy
table 与 f_makeID
和 f_modelID
字段,这样我最终得到的 tb_legacy
字段如下所示:
===============================================
| tb_legacy |
===============================================
| f_makemodel | f_makeID | f_modelID |
|----------------------|----------|-----------|
| CHEVROLET CAPRICE | 1 | 1 |
| CHEVROLET 1500 TRUCK | 1 | 2 |
| FORD MUSTANG | 2 | 3 |
-----------------------------------------------
我有一个 SQL Fiddle 显示 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)
)
但是上面的查询returns出现如下错误:
Error: ER_UPDATE_TABLE_USED: You can't specify target table 'tb_legacy' for update in FROM clause
像这样
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)
您需要像这样将 tb_legacy
连接到其他 2 个表:
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
参见demo。