2010-10-21 8 views
5

J'ai ces tables:tableau avec des valeurs d'une autre table

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 

Je veux remplir les valeurs NULL à invoice.vat_number avec les valeurs actuelles de customer.vat_number. Est-il possible de le faire avec une seule instruction SQL?

Ce que je déclenche donc bien une erreur de syntaxe:

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; 

Répondre

4

En utilisant MySQL, ANSI-92 syntaxe JOIN:

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

En utilisant MySQL, ANSI-89 Syntaxe de JOIN:

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

Pour more info, see the MySQL UPDATE documentation. C'est une syntaxe d'instruction UPDATE spécifique à MySQL, qui n'est pas susceptible d'être prise en charge sur d'autres bases de données.

+0

UPDATE + JOIN + SET Il est difficile de repérer dans le manuel, même si maintenant je sais comment c'est fait, c'est un peu évident ... Merci beaucoup –

+0

La syntaxe "ANSI-92 JOIN" est trompeuse. conforme à ANSI-92: n'autorise pas de JOIN du tout, nécessite l'utilisation de sous-requêtes scalaires, par exemple 'UPDATE INVOICE SET vat_number = (SELECT client_id FROM CLIENT O C CUSTOMER.customer_id = INVOICE.customer_id) O WH EXISTE (SELECT * FROM CLIENT O WH CUSTO MER.customer_id = INVOICE.customer_id); ' – onedaywhen

+0

... notant que vous indiquerez plus tard qu'il s'agit d'une syntaxe propriétaire. – onedaywhen

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

Ici, vous allez


SET VAT_NUMBER = cu.vat_number/* Erreur de syntaxe ici */ Le erreur est parce que le nom de la colonne var_number est ambigu - MySQL ne sait pas s'il s'agit de i.vat_number ou de cu, vat_number.

+0

@Yasen, j'ai formaté le code dans votre réponse. –

+0

Merci @RC Je ne pense pas qu'il a vraiment besoin d'une sous-requête pour une tâche aussi simple. –

+0

Cela fonctionne bien mais je trouve les jointures implicites difficiles à comprendre. Cela peut-il être réécrit comme INNER JOIN? –

3

Quelque chose comme:

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

Cette syntaxe fonctionne bien (sauf 'in' est un mot-clé réservé.) Merci –

+0

Cela suppose que toutes les valeurs' INVOICE.vat_number' sont NULL - celles qui ne le sont pas seront toujours remplacées par la valeur '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