Избегайте предложения CASE при импорте данных на SQL Server

#sql #sql-server #import

#sql #sql-server #импорт

Вопрос:

Мне нужно импортировать данные из старой схемы в новую, где столбец ‘career_name’ (в таблице ‘users’), который раньше был VARCHAR , теперь должен быть INTEGER , который является внешним ключом к другой таблице careers . Таким образом, я намерен уточнить данные, которые были сохранены в VARCHAR столбце, чтобы сохранить целостность в моей базе данных.

На самом деле, я делаю следующее:

  1. Создайте обе новые таблицы в новой схеме
  2. Используйте SELECT DISTINCT 'career_name' FROM old_table для получения всех возможных значений
  3. INSERT в моей новой таблице careers строки, полученные выше
  4. INSERT данные в мою новую таблицу users с использованием предложения CASE, чтобы получить идентификатор из таблицы careers соответствующего первого career_name , чтобы создать связь.

Теперь проблема заключается в следующем: таблица careers большая, поэтому написать одно предложение CASE для каждой строки в таблице для импорта users практически невозможно.

Есть ли способ избежать этого? Я хотел бы использовать свою таблицу careers в качестве ассоциативного массива, где ключом был первый career_name , а значением — идентификатор строки… Спасибо!

Комментарии:

1. Это кажется простым. Почему вы не можете просто объединить старые данные с новой таблицей карьеры, чтобы получить идентификатор?

Ответ №1:

 INSERT into new_Users 
SELECT Users.Name, careers.id
FROM Users inner join careers ON Users.career_name = careers.career_name
  

Поскольку схема мне неизвестна, я предполагаю, что в таблице new_users есть 2 столбца: name и career_id.

Ответ №2:

Есть ли способ избежать этого? Я хотел бы использовать свою таблицу ‘careers’ в качестве ассоциативного массива, где ключом было прежнее ‘career_name’, а значением — идентификатор строки… Спасибо!

Er… Это и есть таблица, не так ли? Просто присоединитесь к своей новой таблице карьеры, чтобы использовать ее в качестве подстановки при выполнении вставки:

 INSERT INTO users (blah, whatever, career_id)
SELECT
  old_users_table.blah,
  old_users_table.whatever,
  careers.career_id
FROM
  old_users_table INNER JOIN careers ON old_users_table.career_name = careers.career_name
  

… где users находится ваша новая таблица users, old_users_table где вы получаете данные, которые хотите перенести, и careers ваша новая таблица карьеры.