我想做什么:
我有一个标准化的数据库,其中包含3个表。我要做的就是用MODEL
等于8的SERIES
值替换所有OEMID
值。
我以每个表中的5行为例:
系列表
+--------+----------+
| series | seriesid |
+--------+----------+
| 1001 | 7 |
| 10036 | 8 |
| 10067 | 9 |
| 1007 | 10 |
| 10076 | 11 |
+--------+----------+
模型表
+---------+----------------------------------------+
| ModelId | Model |
+---------+----------------------------------------+
| 6694 | 1001 - 71 Flexi Unit Planter - 30Aug01 |
| 8264 | 10036 - 315SJ Backhoe Loader |
| 8263 | 10067 - 310J Backhoe Loader - 20Jul17 |
| 6693 | 1007 - 60 Lawn Tractor - 30Aug01 |
| 8262 | 10076 - 853JH Tracked Harvester |
+---------+----------------------------------------+
主数据表
+------------+----------+-------------+------------------------------+------+-------+----------+---------+-----------------+----------------+
| partnumber | partname | description | imageurl | qty | oemid | seriesid | modelid | functiongroupid | assemblynameid |
+------------+----------+-------------+------------------------------+------+-------+----------+---------+-----------------+----------------+
| A32 | Lens | RED | AP3415_________UN01JAN94.gif | 2 | 8 | 7 | 6694 | 12318 | 449980 |
| 14274 | Nut | M10 | TX1061736______UN20JUL09.gif | 1 | 8 | 8 | 8264 | 13996 | 884056 |
| C1115 | HC | NLA ORDER | 0000897883____________A2.gif | 1 | 8 | 9 | 8263 | 13962 | 880092 |
| 03H1626 | BOLT | 1/4 X 1/2 | M5004__________UN02JAN94.gif | 1 | 8 | 10 | 6693 | 17549 | 89782 |
| 1854 | Screw | M10 X 80 | TX1030795______UN25OCT07.gif | 4 | 8 | 11 | 8262 | 14029 | 891643 |
+------------+----------+-------------+------------------------------+------+-------+----------+---------+-----------------+----------------+
因此,让我们采用masterdata表中的第一行。我想将1001
系列替换为1001 - 71 Flexi Unit Planter - 30Aug01
我尝试过的事情:
我尝试的第一件事是:
将所有不同的模型插入到oemid = 8
的系列表中INSERT INTO SERIES(SERIES) SELECT DISTINCT M.MODEL FROM MASTERDATA MD JOIN MD.MODELID=M.MODELID WHERE MD.OEMID=8;
由于SERIESID
列是自动递增的,因此我不需要手动设置ID。然后,我尝试更新MASTERDATA
表以反映此更改:
UPDATE MASTERDATA MD JOIN MODEL M ON M.MODELID=MD.MODELID JOIN SERIES S ON S.SERIES=M.MODEL SET MD.SERIESID=S.SERIESID WHERE MD.OEMID=8;
该查询的目的是因为MODEL
表已使用MASTERDATA
连接到MODELID
表,因为我没有更改任何MODEL
值。然后,我在SERIES
等于MODEL
的{{1}}表上加入MODEL
表。这将使我得到每个SERIES
的{{1}}。然后,我只需将SERIESID
中的MODEL
设置为SERIESID
表中的MASTERDATA
。但是,这在我运行时不起作用。
我唯一剩下的选择是编写一个外部程序来处理此问题,但我宁愿不要走这条路。谁能提供解决方案?
不确定是否重要,但是我正在Linux CentOS 7上运行数据库。
谢谢。
编辑1:
这是插入SERIESID
值后的SERIES
表的样子:
SERIES
我的计划是使用上面在MODEL
上看到的查询,然后对系列运行查询以删除+----------------------------------------+-----------+
| series | seriesid |
+----------------------------------------+-----------+
| 1001 | 7 |
| 10036 | 8 |
| 10067 | 9 |
| 1007 | 10 |
| 10076 | 11 |
| 1001 - 71 Flexi Unit Planter - 30Aug01 | 256 |
| 10036 - 315SJ Backhoe Loader | 257 |
| 10067 - 310J Backhoe Loader - 20Jul17 | 258 |
| 1007 - 60 Lawn Tractor - 30Aug01 | 259 |
| 10076 - 853JH Tracked Harvester | 260 |
+----------------------------------------+-----------+
表中不存在2.
的所有行。
编辑2:
我希望SERIESID
看起来像这样:
MASTERDATA
答案 0 :(得分:2)
请在下面尝试执行此选择查询,您的要求对我来说还不是很清楚,但仍希望它能对您有所帮助
select
C.partnumber,
C.partname,
C.description,
C.imageurl,
C.qty,
C.oemid,
A.seriesid,
B.ModelId,
C.functiongroupid,
C.assemblynameid
from
Series A,
Model B,
Masterdata C
where
C.modelid=B.ModelId and
A.series = SUBSTRING_INDEX(B.Model,' - ', 1);
注意::假设SUBSTRING_INDEX
表中Model
列的第一部分与{中的Model
列的值相同,则使用series
{1}}表。如果它与您在 EDIT 1 中提到的值直接匹配,那么我们可以直接将其等同。
如果上面的选择查询为您提供了所需的输出,那么要直接在Series
中更新seriesid
,我们可以使用下面的更新查询,
Masterdata
如果要删除匹配项以外的条目,则可以使用相同的where子句的相反情况,希望对您有所帮助,