Обновление таблицы путем ссылки на другую таблицу - PullRequest
8 голосов
/ 18 июля 2011

У меня есть таблица CustPurchase (имя, покупка) и другая таблица CustID (идентификатор, имя).

Я изменил таблицу CustPurchase для получения поля id.Теперь я хочу заполнить это вновь созданное поле, ссылаясь на идентификаторы клиентов из таблицы CustID, используя:

UPDATE CustPurchase
   SET CustPurchase.id = CustID.id 
 WHERE CustPurchase.name = CustID.name;

Я получаю синтаксические ошибки!

Ответы [ 2 ]

14 голосов
/ 18 июля 2011

Я полагаю, что вы используете полезный синтаксис UPDATE FROM.

UPDATE CustPurchase SET id = CI.id 
FROM
   CustPurchase CP
   inner join CustID CI on (CI.name = CP.name)

Это может быть следующим:

UPDATE CustPurchase SET id = CI.id 
FROM
   CustID CI 
WHERE
   CI.name = CustPurchase.name

Извините, я далеко от своей машины Postgres; однако на основе ссылки выглядит так, что это допустимо. Проблема в том, включать ли исходную таблицу в список from_list.

4 голосов
/ 18 июля 2011

Присоединение по имени - не идеальный выбор, но это должно работать:

UPDATE custpurchase
   SET id = (SELECT c.id
               FROM CUSTID c
              WHERE c.name = custpurchase.name)

Предостережение заключается в том, что если совпадения не найдено, значение, которое будет пытаться вставить, будет NULL. Предполагая, что столбец id не разрешит NULL, но допустит повторяющиеся значения:

UPDATE custpurchase
   SET id = (SELECT COALESCE(c.id, -99)
               FROM CUSTID c
              WHERE c.name = custpurchase.name)

COALESCE вернет первое ненулевое значение. Если установить значение, превышающее то, что вы обычно ожидаете, вам будет легче изолировать такие записи и обращаться с ними надлежащим образом.

В противном случае вам придется выполнить обновление «от руки», по имени по имени, чтобы исправить экземпляры, которые SQL не смог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...