2011-10-27 27 views
13

如何更新也存在於子查詢中的表?我需要分兩個階段來完成嗎? (創建一個臨時表 - 將所選數據放入其中,然後更新決賽桌)如何通過加入從select中進行更新

我試圖用每個CTN的網絡標籤更新invoiceLine表。

最終的結果將是:

  • invoiceLine

    ctn  network 
    1234  network1 
    2345  network2 
    3456  network1 
    

我有以下表格:

  • invoiceLine

    ctn  network 
    1234  null 
    2345  null 
    3456  null 
    
  • 終端

    ctn  network 
    1234  1 
    2345  2 
    3456  1 
    
  • 網絡

    id  label 
    1   network1 
    2   network2 
    

我可以運行一個選擇,但我不知道如何使用更新聯接:

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 

但是MySQL t hrows一個

錯誤代碼:1093您不能指定目標表「invoiceLine」的更新在FROM子句

+0

的可能的複製[如何使用JOIN更新詢問?](http://stackoverflow.com/questions/15209414/how-to-use-join-in-update-query) –

回答

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

工程治療...謝謝:-) - 將在6分鐘內接受您的答案,何時SO讓我! – ManseUK

+0

作品魅力,謝謝! –

+0

而WHERE和LIMIT關鍵字會在SET關鍵字之後。 – mlg

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