У меня 3 стола, Order, Customer, OrderCustomer:

< Сильный > Заказ :

order_number    customer_number
----------------------------------    
1               null
2               null

< Сильный > Клиент :

customer_number    customer_code    
-----------------------------------
  33               z-99
  34               z-100

< Сильный > OrderCustomer :

order_number customer_code
----------------------------
  1            z-99
  2            z-100

Я попробовал:

UPDATE order
SET o.[customer_number] = c.[customer_number]
FROM order AS o
INNER JOIN orderCustomer AS oc ON o.[order_number] = oc.[order_number]
INNER JOIN customer AS c ON oc.[customer_code] = c.customer_code

Но выполнение вышеуказанного запроса вызывает ошибку:

Не удалось связать составной идентификатор «o.customer_number».

Как я могу обновить order.customer_number значениями customer.customer_number?

0
adlisval 24 Сен 2018 в 19:34

2 ответа

Лучший ответ

Вам нужно обновить псевдоним вместо таблицы. Кроме того, не включайте псевдоним в предложение SET. И последнее, но не менее важное: вы ДОЛЖНЫ заключить порядок в таблице в квадратные скобки. Вам действительно следует избегать использования зарезервированных слов в качестве имен объектов.

UPDATE o
SET [customer_number] = c.[customer_number]
FROM [order] AS o
INNER JOIN orderCustomer AS oc
    ON o.[order_number] = oc.[order_number]
INNER JOIN customer AS c
    ON oc.[customer_code] = c.customer_code
0
Sean Lange 24 Сен 2018 в 16:37

Используйте псевдоним для update:

UPDATE o
    SET o.[customer_number] = c.[customer_number]
    FROM order o JOIN
         orderCustomer oc
         ON o.[order_number] = oc.[order_number] JOIN
         customer AS c
         ON oc.[customer_code] = c.customer_code;

SQL Server позволяет использовать ваш синтаксис, волшебным образом распознавая, что order относится к o в предложении FROM. Использование имени таблицы при замене псевдонима меня смущает.

SQL Server считает, что то, что вы обновляете, называется «заказами», а не «o», поэтому ссылка в SET вызывает проблему.

Фактически, SQL Server позволяет обновлять только одну таблицу, поэтому псевдоним избыточен в set:

UPDATE o
    SET [customer_number] = c.[customer_number]
    FROM order o JOIN
         orderCustomer oc
         ON o.[order_number] = oc.[order_number] JOIN
         customer AS c
         ON oc.[customer_code] = c.customer_code;

Это также будет работать с UPDATE order, но я настоятельно рекомендую вам использовать псевдоним после того, как вы его определили.

0
Gordon Linoff 24 Сен 2018 в 16:37