2011-11-30 35 views
29

Chcę zaktualizować tabelę w oświadczeniu, które ma kilka sprzężeń. Chociaż wiem, że kolejność złączeń nie ma większego znaczenia (chyba, że ​​korzystasz z podpowiedzi optymalizatora), zamówiłem je w pewien sposób, aby było najbardziej intuicyjne w czytaniu. Jednak powoduje to, że tabela, którą chcę zaktualizować, nie jest tą, od której zaczynam, i mam problem z jej aktualizacją.Aktualizacja MySql Dołączona tabela

Manekin przykładem tego, co chciałbym zrobić, to coś takiego:

UPDATE b 
FROM tableA a 
JOIN tableB b 
    ON a.a_id = b.a_id 
JOIN tableC c 
    ON b.b_id = c.b_id 
SET b.val = a.val+c.val 
WHERE a.val > 10 
    AND c.val > 10; 

Istnieje wiele wpisów dotyczących aktualizacji z dołącza tu jednak zawsze mają stół aktualizowany jako pierwszy. Wiem, że jest to możliwe w SQL Server i mam nadzieję, że jest to możliwe w MySQL Too!

+0

Musisz wstawić 'SET b.val = a.val + c.val' przed' Z ... '. Zobacz http://stackoverflow.com/questions/2334712/sql-server-update-from-select – Gerben

+0

Ten przykład ma SET po poleceniu, a te przykłady aktualizują pierwszą tabelę w porządku łączenia. Chciałbym zaktualizować tabelę w połowie zamówienia łączenia. – Zugwalt

+0

To nie powinno mieć znaczenia. Nawet gdyby tak było, mógłbyś po prostu zmienić kolejność złączeń (tableB b JOIN tableA a ON a.a_id = b.a_id'). – Gerben

Odpowiedz

78

multi-table UPDATE składnia w MySQL różni się od programu Microsoft SQL Server. Nie musisz powiedzieć, który stół (y) jesteś aktualizacji, to ukryte w klauzuli SET.

UPDATE tableA a 
JOIN tableB b 
    ON a.a_id = b.a_id 
JOIN tableC c 
    ON b.b_id = c.b_id 
SET b.val = a.val+c.val 
WHERE a.val > 10 
    AND c.val > 10; 

nie ma klauzuli FROM w składni MySQL.

UPDATE z JOIN nie jest standardowym SQL i zarówno MySQL, jak i Microsoft SQL Server wdrożyły własne pomysły jako rozszerzenie standardowej składni.

+0

ORDER BY i LIMIt nie używać w przyłączeniu się do – zloctb

+0

@zloctb, tak, to dobra wskazówka! Z jakiegoś powodu składnia wielostolikowej aktualizacji w MySQL nie obsługuje ORDER BY i LIMIT. Cf. http://dev.mysql.com/doc/refman/5.6/en/update.html –

0

Ta link powinna dać ci składnię, której potrzebuje MySQL i here. Dlaczego musisz dołączyć do dwóch tabel? czy to jest aktualizacja rekordów? Pytam, ponieważ możesz również wykonać następujące czynności:

update B set B.x=<value> 
    where 
B.<value> is in(
    select A.y 
     from A left outer join B on A.<value>=B.<value> 
) 
+0

Te przykłady aktualizują pierwszą tabelę w porządku łączenia. Chciałbym zaktualizować tabelę w połowie zamówienia łączenia. – Zugwalt

3

Masz błędnie ustawione kolejność instrukcji. Można przeczytać o składni here (wiem, jest to dość trudne do odczytania.

UPDATE tableA a 
    JOIN tableB b 
    ON a.a_id = b.a_id 
    JOIN tableC c 
    ON b.b_id = c.b_id 
    SET b.val = a.val+c.val 
WHERE a.val > 10 
    AND c.val > 10; 

sql fiddle

+1

Ta składnia nie działa. Musisz usunąć partię FROM i przenieść część SET do po JOINs. – draca

+0

Masz rację, zmieniłem to na coś, co działa. –