更新表。 SET语句语法错误?

时间:2016-09-23 16:59:08

标签: mysql sql

我还需要一些帮助。好的,我有一张表如下:

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语法错误。

4 个答案:

答案 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。