2010-10-21 19 views
5

que tienen estas tablas:Actualización de la tabla con valores de otra tabla

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 

Quiero llenar los valores NULL en invoice.vat_number con los valores actuales de customer.vat_number. ¿Es posible hacerlo con una sola instrucción SQL?

Lo que tengo hasta ahora desencadena un error de sintaxis:

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; 

Respuesta

4

El uso de MySQL, ANSI-92 JOIN sintaxis:

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

El uso de MySQL, ANSI-89 JOIN sintaxis:

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

Para more info, see the MySQL UPDATE documentation. Esta es la sintaxis de la sentencia UPDATE específica de MySQL, que probablemente no sea compatible con otras bases de datos.

+0

Eso es todo: ACTUALIZAR + UNIR + CONFIGURAR. Es difícil de detectar en el manual aunque, ahora sé cómo se hace, es obvio ... Muchas gracias –

+0

"SINTAGIA ANSI-92 UNIR" es engañosa. La sintaxis publicada no es correcta. cumple con ANSI-92: no permite un JOIN en absoluto, requiere el uso de subconsultas escalares, por ejemplo, 'UPDATE INVOICE SET_vat_number = (SELECCIONAR ID_cliente FROM CLIENTE DONDE CLIENTE.Nivel_personalizado = INVOICE.número_cliente) DONDE EXISTE (SELECCIONAR * DESDE EL CLIENTE DONDE COINCIDE MER.customer_id = INVOICE.customer_id); ' – onedaywhen

+0

... señalando que más tarde señala que es una sintaxis patentada. – onedaywhen

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

Aquí tiene


SET VAT_NUMBER = cu.vat_number/* Error de sintaxis por aquí */El El error se debe a que el nombre de la columna var_number es ambiguo: MySQL no sabe si es i.vat_number o cu, vat_number.

+0

@Yasen, he formateado el código en su respuesta. –

+0

Gracias @RC No creo que realmente necesite una subconsulta para una tarea tan simple. –

+0

Esto funciona bien pero encuentro que las uniones implícitas son difíciles de entender. ¿Se puede reescribir esto como UNIÓN INTERNA? –

3

Algo así como:

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

Esta sintaxis funciona bien (excepto que 'in' es una palabra clave reservada.) ¡Gracias! –

+0

Esto supone que todos los valores' INVOICE.vat_number' son NULL; aquellos que no lo son, se sobrescribirán con el valor '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 
Cuestiones relacionadas