我还需要一些帮助。好的,我有一张表如下:
mysql> SELECT * FROM MODELOS;
+--------+----------+---------+
| ID_MOD | ID_MARCA | MODELO |
+--------+----------+---------+
| 1 | NULL | PICASSA |
| 2 | NULL | C4 |
| 3 | NULL | C3 |
| 4 | NULL | C2 |
| 5 | NULL | MONDEO |
| 6 | NULL | S-MAX |
| 7 | NULL | CIVIC |
| 8 | NULL | ACCORD |
| 9 | NULL | CLS |
| 10 | NULL | 900 |
| 11 | NULL | LEON |
| 12 | NULL | IBIZA |
| 13 | NULL | 307 |
| 14 | NULL | 308 |
| 15 | NULL | 407 |
| 16 | NULL | 408 |
| 17 | NULL | MEGANE |
| 18 | NULL | PASSAT |
| 19 | NULL | GOLF |
| 20 | NULL | TOUAREG |
+--------+----------+---------+
和另一个,FILE,看起来像这样:
+----------+------------+---------+-----------+--------+
| ID_MARCA | MARCA | MODELO | MATRICULA | PRECIO |
+----------+------------+---------+-----------+--------+
| 1 | CITROEN | PICASSA | CPG-2044 | 12000 |
| 1 | CITROEN | PICASSA | CPR-1762 | 12500 |
| 1 | CITROEN | C4 | FPP-1464 | 13500 |
| 1 | CITROEN | C4 | FDR-4563 | 13000 |
| 1 | CITROEN | C3 | BDF-8856 | 8000 |
| 1 | CITROEN | C3 | BPZ-7878 | 7500 |
| 1 | CITROEN | C2 | CDR-1515 | 5000 |
| 1 | CITROEN | C2 | BCC-3434 | 4500 |
| 2 | FORD | MONDEO | BTG-3267 | 8000 |
| 2 | FORD | MONDEO | BPP-6792 | 8200 |
| 2 | FORD | S-MAX | FDR-1564 | 20000 |
| 2 | FORD | S-MAX | FCE-9327 | 21000 |
| 3 | HONDA | CIVIC | FCC-7764 | 16000 |
| 3 | HONDA | CIVIC | FBC-4567 | 14000 |
| 3 | HONDA | ACCORD | FFC-6768 | 22000 |
| 3 | HONDA | ACCORD | FPB-2231 | 23000 |
| 4 | MERCEDES | CLS | FDR-2265 | 31000 |
| 5 | SAAB | 900 | FPG-1165 | 21000 |
| 6 | SEAT | LEON | DVB-1119 | 14500 |
| 6 | SEAT | LEON | DCR-5634 | 13500 |
| 6 | SEAT | IBIZA | DPR-3434 | 9500 |
| 6 | SEAT | IBIZA | DPP-8756 | 10000 |
| 7 | PEUGEOT | 307 | DGX-4598 | 5500 |
| 7 | PEUGEOT | 307 | DGG-2098 | 5000 |
| 7 | PEUGEOT | 308 | DPK-3859 | 5500 |
| 7 | PEUGEOT | 308 | DVK-4987 | 6000 |
| 7 | PEUGEOT | 407 | FFK-1513 | 7500 |
| 7 | PEUGEOT | 407 | FPP-3768 | 8000 |
| 7 | PEUGEOT | 408 | CPG-7879 | 10000 |
| 7 | PEUGEOT | 408 | CRC-9738 | 9500 |
| 8 | RENAULT | MEGANE | CQC-4298 | 11000 |
| 8 | RENAULT | MEGANE | FNZ-7688 | 6000 |
| 9 | VOLKSWAGEN | PASSAT | FNR-3987 | 16000 |
| 9 | VOLKSWAGEN | PASSAT | FQK-3987 | 18000 |
| 9 | VOLKSWAGEN | GOLF | FCJ-0909 | 22500 |
| 9 | VOLKSWAGEN | GOLF | FCK-3989 | 21000 |
| 9 | VOLKSWAGEN | TOUAREG | DGG-0937 | 42000 |
+----------+------------+---------+-----------+--------+
我要做的是更新表MODELOS中的列ID_MARCA,方式是ID_MARCA与MODELO列中的字段对应。例如,在表MODELOS中我有一个字段PICASSA,我需要列ID_MARCA中的相应字段值为1,因为它是CITROEN和PICASSA的ID,如果你查看表FILE是CITROEN。 所以,我已经得到了这个更新声明:
UPDATE TABLE MODELOS
SET ID_MARCA = (SELECT ID_MARCA FROM FILE)
WHERE FILE.MARCA IN (SELECT MARCA FFROM MODELOS);
但是此语句返回SQL语法错误。
答案 0 :(得分:2)
我建议你不要使用子查询进行更新,如果由于任何原因,通过5.7的MySQL不能在子查询内部进行优化。
来自文档:(https://dev.mysql.com/doc/refman/5.7/en/subquery-optimization.html)
注意强>
使用子查询修改单个表的UPDATE和DELETE语句的限制是优化程序不使用半连接或实现子查询优化。作为解决方法,尝试将它们重写为使用连接而不是子查询的多表UPDATE和DELETE语句。
我使用加入联接:
UPDATE TABLE MODELOS m
JOIN FILE f ON m.MARCA = f.MARCA
SET m.ID_MARCA = f.ID_MARCA
答案 1 :(得分:1)
首先,请注意给定$('#'serverCompTab]
____^_____________^
| |__ //Replace it by ')'
|__ //Move it to the end
的给定文件有多行。您可能不想进行多次更新。
其次,我不容易在您的查询中检测到语法错误。我确实检测到两个运行时错误。第一个是(在MySQL中)你不能引用正在更新的表(这可能是编译时错误)。其次,子查询返回多行。
如果要遵循使用子查询的路径,请使用相关子查询:
marca
答案 2 :(得分:0)
当您更新表格时,总是使用非常有效的MERGE功能。
MERGE INTO MODELOS M
USING FILE F
ON (M.MODELO = F.MODELO)
WHEN MATCHED THEN
UPDATE SET
M.ID_MARCA = F.ID_MARCA;
答案 3 :(得分:0)
好的,我得到了一个解决方案。删除表MODELOS中的所有数据并使用表FILE以下列方式更新它:
access_token
显然,最佳解决方案是简单的解决方案。谢谢大家的帮助和建议。很多appreaciated。