2011-10-27 8 views
13

Jak mogę zaktualizować tabelę, która jest również obecna w podzapytaniu? Czy muszę to zrobić w 2 etapach? (utwórz tabelę tymczasową - umieść w niej wybrane dane, a następnie zaktualizuj tabelę końcową).Jak zaktualizować z select przy użyciu opcji Dołącz

Próbuję zaktualizować tabelę invoiceLine z etykietą sieci dla każdego CTN.

Efektem końcowym będzie:

  • invoiceLine

    ctn  network 
    1234  network1 
    2345  network2 
    3456  network1 
    

mam następujące tabele:

  • invoiceLine

    ctn  network 
    1234  null 
    2345  null 
    3456  null 
    
  • zacisk

    ctn  network 
    1234  1 
    2345  2 
    3456  1 
    
  • sieć

    id  label 
    1   network1 
    2   network2 
    

mogę uruchomić select, ale nie jestem pewien, jak zaktualizować z złączenia:

update invoiceLine 
inner join terminal on terminal.ctn = invoiceLine.ctn 
set invoiceLine.network = 
(
    select network.label 
    from invoiceLine 
    inner join terminal on terminal.ctn = invoiceLine.ctn 
    inner join network on network.id = terminal.network 
) 
where invoiceLine.ctn = terminal.ctn 

, ale MySQL t hrows kodeks

Błąd: 1093. Nie można określić tabelę docelową 'invoiceLine' dla aktualizacji z klauzulą ​​

+0

Możliwy duplikat [Jak korzystać przyłączyć zapytania UPDATE ?] (http://stackoverflow.com/questions/15209414/how-to-use-join-in-update-query) –

Odpowiedz

28
UPDATE invoiceLine 
    INNER JOIN terminal 
     ON invoiceLine.ctn = terminal.ctn 
    INNER JOIN network 
     ON terminal.network = network.id 
    SET invoiceLine.network = network.label 
+0

Działa na poczęstunek ... dzięki :-) - zaakceptuje twoją odpowiedź w 6 minut, kiedy SO pozwala mi! – ManseUK

+0

działa jak urok, dzięki! –

+0

Słowa kluczowe WHERE i LIMIT pójdą za słowem kluczowym SET. – mlg

3
UPDATE invoiceLine SET network = (
    SELECT label FROM network WHERE id = (
     SELECT network FROM terminal WHERE terminal.ctn = invoiceLine.ctn 
    ) 
) 
Powiązane problemy