2011-10-27 32 views
13

Làm cách nào để cập nhật bảng cũng có trong truy vấn phụ? Tôi có phải làm điều đó trong 2 giai đoạn không? (tạo một bảng tạm thời - đặt dữ liệu được chọn vào nó và sau đó cập nhật bảng cuối cùng)Cách cập nhật từ chọn bằng Tham gia

Tôi đang cố gắng cập nhật bảng hóa đơn Bảng với nhãn của mạng cho mỗi CTN.

Kết quả cuối cùng sẽ là:

  • invoiceLine

    ctn  network 
    1234  network1 
    2345  network2 
    3456  network1 
    

tôi có các bảng sau:

  • invoiceLine

    ctn  network 
    1234  null 
    2345  null 
    3456  null 
    
  • terminal

    ctn  network 
    1234  1 
    2345  2 
    3456  1 
    
  • mạng

    id  label 
    1   network1 
    2   network2 
    

tôi có thể chạy một lựa chọn nhưng tôi không chắc chắn làm thế nào để cập nhật với một tham gia:

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 

nhưng MySQL t hrows Mã

Lỗi: 1093. Bạn không thể chỉ định bảng mục tiêu 'invoiceLine' để cập nhật trong mệnh đề FROM

+0

trùng lặp có thể xảy ra của [Làm thế nào để sử dụng JOIN trong truy vấn UPDATE ?] (http://stackoverflow.com/questions/15209414/how-to-use-join-in-update-query) –

Trả lời

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

Làm việc một điều trị ... cảm ơn :-) - sẽ chấp nhận câu trả lời của bạn trong 6 phút, khi nào SO cho phép tôi! – ManseUK

+0

hoạt động như sự quyến rũ, cảm ơn! –

+0

Và từ khóa WHERE và LIMIT sẽ xuất hiện sau từ khóa SET. – mlg

3
UPDATE invoiceLine SET network = (
    SELECT label FROM network WHERE id = (
     SELECT network FROM terminal WHERE terminal.ctn = invoiceLine.ctn 
    ) 
) 
Các vấn đề liên quan