Как обновить строки с идентификаторами из одного списка со значениями из другого списка

0

Есть ли простое выражение MySQL/SQL для обновления записей, идентификаторы которых находятся в списке, со значениями, предоставленными другим списком?

ПРИМЕР:

List of customer ids -

  001, 002, 003, 004, ... (etc. list of 1000+ customer ids)

List of order ids -

  00A, 00B, 00C, 00D, ... (etc. list of 1000+ order ids)

Я хочу простой способ сделать следующее, не имея SQL-операторов 1000+, подобных этому -

update order set orderId = '00A' where customerId = 001;

update order set orderId = '00B' where customerId = 002;

update order set orderId = '00C' where customerId = 003;

etc.

ПРИМЕЧАНИЕ. Списки находятся в правильной последовательности customerId, чтобы заказатьId, 001 для заказа 00A, 002 для заказа 00B и т.д.

  • 1
    Существует ли простое выражение MySQL / SQL для обновления записей, чьи идентификаторы находятся в списке, со значениями, предоставленными другим списком? Нет более 1000 отдельных операторов SQL, более простых. Потому что один оператор SQL должен генерировать правильный orderId foreach customerId. Также сложно ответить, не зная структуры таблиц и пример данных. Поэтому 27-й customerId 027 должен иметь orderId, равный 0A0 чтобы проверить это я понимаю последовательность?
Теги:

1 ответ

1

Если идентификатор заказа - это просто шестнадцатеричное значение идентификатора клиента, вы можете сделать это:

UPDATE 'order' SET orderId = LPAD(HEX(customerId+9), 3, '0');

Если вы хотите больше контролировать отображение, я бы создал таблицу с отображением:

CREATE TABLE customerid_orderid (
  customerId char(3),
  orderId char(3),
  PRIMARY KEY (customerId, orderId)
);

Загрузите его с помощью пар, которые вы хотите.

Затем сделайте многоэтажное ОБНОВЛЕНИЕ:

UPDATE 'order' AS o
JOIN customerid_orderid AS c USING (customerId)
SET o.orderId = c.orderId;

PS: Возможно, было бы удобнее избегать использования зарезервированных слов SQL (например, order) в качестве имени вашей таблицы.

  • 1
    @ABogus Обратите внимание, что этот подход поддерживает только до 4086 customerId. Идентификатор клиента 4087 будет разбит, потому что шестнадцатеричный кодекс имеет ширину 4 символа вместо трех. sqlfiddle.com/#!9/340e01/435 +1 за находку, это приятно.
  • 1
    Да, я согласен. ОП должен предоставить более подробную информацию о том, как идентификаторы заказа форматируются из идентификаторов клиентов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню