Объедините два столбца вместе из разных таблиц

StackOverflow https://stackoverflow.com/questions/3285189

  •  17-09-2020
  •  | 
  •  

Вопрос

Допустим, например:

  • У меня есть два стола: старые данные и new_data новые данные.

  • И то , и другое старые данные и new_data новые данные пусть один столбец называется это_is_col.

  • И то , и другое старые данные и new_data новые данные имеют различные (сотни) строк дат (2010-02-06, 2010-01-09, 2007-06-02 и т.д.).Обе таблицы не обязательно имеют одинаковые даты, но они обе имеют одинаковый формат.

  • Поля обеих таблиц представляют собой различные целые числа.


Моя задача:

  • Скопируйте поля из старые данные Для new_data новые данные.

  • Если дата существует в обеих таблицах, поле в new_data новые данные будет заменен.

  • Если дата не существует в new_data новые данные, затем будет добавлена правильная строка и поле будет скопировано заново.


Вот как далеко я продвинулся:

Создайте временный столбец:

ALTER TABLE `new_data` ADD `tempColumn` TEXT NULL;

Копирование данных из старые данные:

INSERT INTO `new_data` (`tempColumn`) SELECT `this_is_col` FROM `old_data`;

Объединить временную колонку и new_data новые данные . это_is_col.(Я действительно не разобрался в этом шаге, так как не зашел так далеко).

MERGE? `tempColumn` `this_is_col`;

Удалить временную таблицу

ALTER TABLE `new_data` DROP `tempColumn`;

После выполнения второго действия (переноса данных во временный столбец) Я получаю эту ошибку:

#1062 - Duplicate entry '0000-00-00' for key 1

И теперь я застрял.Будем признательны за любую помощь.Я использую MySQL и phpMyAdmin для тестирования SQL-команд.

Это было полезно?

Решение

Предполагая, что ваши даты индексируются как уникальные ключи:

INSERT INTO newtable
SELECT *
FROM oldtable
ON DUPLICATE KEY column1=oldcolumn1, ...

Другие советы

ты хочешь ВСТАВИТЬ ...ПРИ ОБНОВЛЕНИИ ДУБЛИКАТА КЛЮЧА.ваше решение уже удовлетворяет шагам 1 и 3 вашей задачи, ОБНОВЛЕНИЕ ДУБЛИКАТА КЛЮЧА позаботится о шаге 2.

Если вы предпочитаете сначала удалить строку, а не обновлять: ЗАМЕНИТЬ

Это тоже была бы всего одна строчка, так что:ЗАМЕНИТЕ ВЫБОР данных, вам не пришлось бы проделывать странности с добавлением текстового столбца.

Как насчет того, чтобы просто сделать UPDATE и INSERT?

UPDATE new_data SET col=col 
FROM new_data a join old_data b on a.this_is_col = b.this_is_col

Тогда

INSERT INTO new_data (cols) SELECT cols 
FROM old_data WHERE this_is_col NOT IN (SELECT this_is_col FROM new_data)

Если только я не неправильно понял...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top