2010-10-21 26 views
5

mam tych tabel:Aktualizacja tabeli z wartościami z innej tabeli

customer: 
    customer_id vat_number 
    =========== ========== 
       1 ES-0000001 
       2 ES-0000002 
       3 ES-0000003 


invoice: 
    invoice_id customer_id vat_number 
    ========== =========== ========== 
      100   1 NULL 
      101   3 NULL 
      102   3 NULL 
      103   2 NULL 
      104   3 NULL 
      105   1 NULL 

Chcę wypełnić wartości NULL w invoice.vat_number z aktualnymi wartościami z customer.vat_number. Czy można to zrobić za pomocą pojedynczego polecenia SQL?

Co mam tak daleko wyzwala błąd składni:

UPDATE invoice 
SET vat_number=cu.vat_number /* Syntax error around here */ 
FROM invoice iv 
INNER JOIN customer cu ON iv.customer_id=cu.customer_id 
WHERE invoice.invoice_id=iv.invoice_id; 

Odpowiedz

4

MySQL ANSI-92 Dołącz składnię:

UPDATE INVOICE 
    JOIN CUSTOMER ON CUSTOMER.customer_id = INVOICE.customer_id 
    SET vat_number = CUSTOMER.vat_number 
WHERE INVOICE.vat_number IS NULL 

MySQL ANSI-89 składni złączenia:

UPDATE INVOICE, CUSTOMER 
    SET INVOICE.vat_number = CUSTOMER.vat_number 
WHERE CUSTOMER.customer_id = INVOICE.customer_id 
    AND INVOICE.vat_number IS NULL 

Na more info, see the MySQL UPDATE documentation. Jest to specyficzna dla MySQL składnia instrukcji UPDATE, która prawdopodobnie nie będzie obsługiwana w innych bazach danych.

+0

To wszystko: UPDATE + JOIN + SET. Trudno wyłowić z instrukcji, chociaż teraz wiem, jak to się robi, to oczywiste ... Bardzo dziękuję –

+0

"ANSI-92 JOIN syntax" jest mylące. Zgodny z ANSI-92: w ogóle nie zezwala na JOIN, wymaga użycia podzapytań skalarnych, np. 'UPDATE INVOICE SET vat_number = (WYBIERZ customer_id OD KLIENTA GDZIE KLIENT.customer_id = INVOICE.customer_id) GDZIE ISTNIEJE (WYBIERZ * OD KLIENTA GDZIE CUSTO MER.customer_id = INVOICE.customer_id); ' – onedaywhen

+0

... zauważając, że później zaznaczyłeś, że jest to zastrzeżona składnia. – onedaywhen

4
UPDATE invoice i, customer cu SET i.vat_number=cu.vat_number 
WHERE i.customer_id = cu.customer_id; 

tu proszę


SET VAT_NUMBER = cu.vat_number/* Syntax error tutaj */ The Błąd jest spowodowany tym, że nazwa kolumny var_number jest niejednoznaczna - MySQL nie wie, czy jest to i.vat_number czy cu, vat_number.

+0

@Yasen, sformatowałem kod w odpowiedzi. –

+0

Dzięki @RC Nie sądzę, że naprawdę potrzebuje podzapytania dla tak prostego zadania. –

+0

To działa dobrze, ale trudno mi zrozumieć ukryte połączenia. Czy można to przepisać jako INNER JOIN? –

3

podobnie jak:

UPDATE invoice in 
SET vat_number=(SELECT cu.vat_number FROM customer cu 
WHERE in.customer_id=cu.customer_id) 
-- not tested 
+0

Ta składnia działa dobrze (z wyjątkiem tego, że 'in' jest zastrzeżonym słowem kluczowym) Dziękujemy! –

+0

Zakłada się, że wszystkie wartości' INVOICE.vat_number' są NULL - te, które nie są, będą nadal nadpisywane wartością 'CUSTOMER.vat_number'. –

0
UPDATE iv 
SET iv.vat_number=cu.vat_number 
FROM invoice iv 
INNER JOIN customer cu ON iv.customer_id=cu.customer_id 
Powiązane problemy