2015-06-14 3 views
0

У меня есть оператор SQL, который работает в SQL Server, но не работает в MySQL ... Не должно ли это работать в MySQL?INNER JOIN SELECT в MySQL

UPDATE T2 
    SET TotalAmount = T1.SumAmount 
    FROM ccs_multiples as T2 
    INNER JOIN (SELECT SUM(Amount) as SumAmount, SerialNumber 
       FROM ccs_multiples_items 
       GROUP BY SerialNumber) as T1 
    ON T2.SerialNumber = T1.SerialNumber 

Ошибка:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near FROM ccs_multiples as T2 INNER JOIN (SELECT SUM(Amount) as SumAmount, Seria at line 3

+1

Опишите "* fail *". Любые сообщения об ошибках? Неожиданное поведение? –

+0

** MySQL сказал: ** # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'FROM ccs_multiples как T2 INNER JOIN (SELECT SUM (Amount) as SumAmount, Seria' в строке 3 – Mark

ответ

1

При обновлении с JOIN, вместо того, чтобы делать JOIN, вы можете указать несколько таблиц в обновлении, то есть.

UPDATE table1 t1, table2 t2

, а затем указать, что, как правило, быть вашим JOIN состояние, а не как часть вашего WHERE состояния, как

WHERE t1.someCol=t2.someOtherCol

Так вместо того, чтобы присоединиться, вы могли бы написать свой запрос как это

UPDATE 
    ccs_multiples T2, 
    (SELECT 
    SUM(Amount) AS SumAmount, 
    SerialNumber 
    FROM 
    ccs_multiples_items 
    GROUP BY SerialNumber) T1 
SET 
    T2.TotalAmount = T1.SumAmount 
WHERE T2.SerialNumber = T1.SerialNumber 
+0

Вы подразумеваете, что MySQL не поддерживает ' INNER JOIN'? –

+0

Просто заказываю ... – Mark

+0

@ PM77-1 Я не подразумеваю ничего. Я просто это сделаю.Если у вас есть решение, которое сохраняет внутреннее соединение, пожалуйста, сообщите – chiliNUT

0

Синтаксис для нескольких вкладок le update в MySQL отличается от SQL Server.

Вы можете использовать синтаксис, как это:

UPDATE ccs_multiples T2 
    JOIN (SELECT SUM(i.Amount) AS SumAmount 
       , i.SerialNumber 
      FROM ccs_multiples_items i 
      GROUP BY i.SerialNumber 
     ) T1 
     ON T2.SerialNumber = T1.SerialNumber 
    SET T2.TotalAmount = T1.SumAmount 

ПРИМЕЧАНИЯ:

В MySQL, то INNER необязательное ключевое слово; его отсутствие не влияет на утверждение.

Но что бы вы хотели сделать с строками в ccs_multiples, которые не имеют соответствующих строк в ccs_multiples_items. Для того, чтобы установить TotalAmount столбец к нулю этих строк, вы можете использовать внешнее соединение:

UPDATE ccs_multiples T2 
    LEFT 
    JOIN (SELECT SUM(i.Amount) AS SumAmount 
       , i.SerialNumber 
      FROM ccs_multiples_items i 
      GROUP BY i.SerialNumber 
     ) T1 
     ON T2.SerialNumber = T1.SerialNumber 
    SET T2.TotalAmount = IFNULL(T1.SumAmount,0) 

Одно замечание о синтаксисе MySQL, мы можем (обычно) преобразовать SELECT заявление в UPDATE заявление , Обычно я начинаю с SELECT для проверки предикатов и выражений. Например:

SELECT T2.SerialNumber 
    , T2.TotalAmount   AS existing_TotalAmount 
    , T1.SumAmount 
    , IFNULL(T1.SumAmount,0) AS new_TotalAmount 
    FROM ccs_multiples T2 
    LEFT 
    JOIN (SELECT SUM(i.Amount) AS SumAmount 
       , i.SerialNumber 
      FROM ccs_multiples_items i 
      GROUP BY i.SerialNumber 
     ) T1 
     ON T2.SerialNumber = T1.SerialNumber 

Мы можем проверить этот SELECT и убедиться, что выражения работают правильно. Для того, чтобы преобразовать его в операторе UPDATE, мы просто удалить SELECT ... FROM от начала оператора, и заменить его UPDATE и добавить статью в SET до пункта WHERE.