2016-09-23 83 views
1

我需要一些更多的幫助。 OK,我有一個表,如下所示:更新表。 SET語句錯誤的語法?

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 | 
+--------+----------+---------+ 

,另一個,文件,它看起來是這樣的:

+----------+------------+---------+-----------+--------+ 
| 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 | 
+----------+------------+---------+-----------+--------+ 

我所試圖做的是在表更新列ID_MARCA MODELOS以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

您無法將字段設置爲其他查詢的結果集。您需要加入 – Ray

+0

編輯刪除SQL Server標記,因爲它明顯是MySQL –

+0

'FFROM' - >'FROM' – PetSerAl

回答

1

首先,請注意給定marca的給定文件有多行。你可能不想做多個更新。

其次,我不容易在您的查詢中檢測到語法錯誤。我確實檢測到兩個運行時錯誤。首先是(在MySQL中)不能引用正在更新的表(這可能是編譯時錯誤)。其次,你的子查詢返回多行。

如果你想追隨你使用子查詢的路徑,然後使用一個相關子查詢:

UPDATE MODELOS m 
    SET m.ID_MARCA = (SELECT f.ID_MARCA 
        FROM FILE f 
        WHERE f.MARCA = m.MARCA 
        LIMIT 1 
        ); 
+0

儘管它仍然給我一個錯誤:錯誤1064(42000):您的SQL語法中有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在'table MODELOS m set m.ID_MARCA =(從FILE f中選擇f.ID_MARCA,其中f.MARCA ='在第1行與之前相同「 – CNB

2

我建議你不要使用子查詢進行更新,如果出於任何原因,通過5.7以上的MySQL的ma不能在子查詢中進行優化。

從文檔:(https://dev.mysql.com/doc/refman/5.7/en/subquery-optimization.html

注意

上更新限制和刪除使用子查詢修改單個表是優化程序不使用語句半連接或實現子查詢優化。作爲一種解決方法,嘗試將它們重寫爲使用連接而不是子查詢的多表UPDATE和DELETE語句。

我會使用一個加盟加盟:

UPDATE TABLE MODELOS m 
    JOIN FILE f ON m.MARCA = f.MARCA 
    SET m.ID_MARCA = f.ID_MARCA 
+1

。 。當然,您可以將字段設置爲子查詢的結果。那聲明顯然是虛假的。 –

+0

@GordonLinoff的確你是對的。我現在改變了我的答案,我不建議使用子查詢進行更新 – Ray

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; 
0

OK,我得到了它的解決方案。得到了在表MODELOS擺脫所有數據,並以下列方式使用表文件更新它:

INSERT IGNORE INTO TABLE MODELOS (ID_MARCA, MODELO) 
-> SELECT ID_MODELO, MODELO 
-> FROM FILE; 

顯然,最好的解決方案是簡單的解決方案。感謝大家的幫助和建議。很多appreaciated。