2010-10-21 4 views
5

У меня есть эти таблицы:Обновление таблицы со значениями из другой таблицы

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 

Я хочу, чтобы заполнить пустые значения в invoice.vat_number с текущими значениями из customer.vat_number. Можно ли это сделать с помощью одного оператора SQL?

То, что я до сих пор вызывает синтаксическую ошибку:

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; 

ответ

4

Использование MySQL, ANSI-92 ПРИСОЕДИНЯЙСЯ синтаксис:

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 JOIN Синтаксис:

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

Для more info, see the MySQL UPDATE documentation. Это синтаксис оператора SQL, специфичный для MySQL, который вряд ли будет поддерживаться в других базах данных.

+0

Вот и все: UPDATE + JOIN + SET. Трудно заметить из руководства, хотя теперь я знаю, как это делается, это очевидно. Спасибо большое. –

+0

«ANSI-92 JOIN синтаксис» вводит в заблуждение. совместимый с ANSI-92: не разрешает JOIN вообще, требует использования скалярных подзапросов, например 'UPDATE INVOICE SET vat_number = (SELECT customer_id FROM CUSTOMER WHERE CUSTOMER.customer_id = INVOICE.customer_id) ГДЕ СУЩЕСТВУЕТ (ВЫБРАТЬ * ОТ КЛИЕНТА ГДЕ КЛАСТ MER.customer_id = INVOICE.customer_id); ' – onedaywhen

+0

... отметив, что вы позже указываете, что это проприетарный синтаксис. – onedaywhen

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

Здесь вы идете


SET VAT_NUMBER = cu.vat_number/* Ошибка синтаксиса здесь */ The ошибка в том, что имя столбца var_number неоднозначно - MySQL не знает, является ли это i.vat_number или cu, vat_number.

+0

@ Ясен, я отформатировал код в вашем ответе. – 2010-10-21 15:42:11

+0

Спасибо @RC Я не думаю, что ему действительно нужен подзапрос для такой простой задачи. –

+0

Это прекрасно работает, но я понимаю, что неявные объединения трудно понять. Может ли это быть переписано как INNER JOIN? –

3

Что-то вроде:

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

Этот синтаксис отлично работает (кроме того 'in' - зарезервированное ключевое слово). –

+0

Предполагается, что все значения' INVOICE.vat_number' являются NULL - те, которые не являются, будут по-прежнему перезаписаны значением '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 
Смежные вопросы