2011-10-27 8 views
13

サブクエリにも存在するテーブルを更新するにはどうすればよいですか?私は2つの段階でそれをしなければならないのですか? (一時テーブルを作成する - 選択したデータを入れてから最終テーブルを更新する)結合で選択から更新する方法

各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あなたがのFROM句

+0

可能な二重に更新するために、ターゲットテーブル 'invoiceLine' を指定することはできません[どのようにUPDATEクエリで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分であなたの答えを受け入れるそれで、私はできます! – 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 
    ) 
) 
関連する問題