Копировать значения из одной таблицы в другую на основе сравнения столбцов - PullRequest
1 голос
/ 17 декабря 2011

У меня есть таблица вопросов и ответов в SQL Server 2008 R2.

Вопрос:

q_id
question_text

Ответ:

a_id
question_text
answer_text

Это явно плохой дизайн. Поле question_text дублируется в таблицах Question и Answer, и между Answer и Question нет отношения внешнего ключа. Я хочу создать это отношение, найдя Question (q_id) для каждого Answer, который уже присутствует в таблице Answer. Я бы сделал это, сопоставив значение question_text, скопированное в таблицу Answer, со строками в таблице Question.

Это то, что я хотел бы сделать в псевдокоде.

  • создать пустое поле q_id в таблице Answer (обнуляется, потому что в таблице Answer уже есть данные)
  • выберите все из таблицы Answer.
  • для каждой строки в результате - выберите соответствующий вопрос из таблицы Question, сравнив значение question_text. - вставьте q_id в столбец nullable q_id в таблице Answer
  • Измените столбец q_id в Answer на значение NULL.

Не могли бы вы помочь мне добиться этого в SQL Server 2008 R2? Спасибо.

PS: все значения question_text в таблице Question являются уникальными.

Ответы [ 2 ]

3 голосов
/ 17 декабря 2011

Первый шаг - создать новый столбец q_id:

ALTER TABLE dbo.Answer ADD q_id INT NULL

Второй шаг - обновление на основе question_text

UPDATE dbo.Answer
SET q_id = q.q_id
FROM dbo.Question q
WHERE dbo.Answer.question_text = q.question_text

Третий шаг - если у вас нет значений NULL:

ALTER TABLE dbo.Answer ALTER COLUMN q_id INT NOT NULL

Четвертый шаг - установить ссылку FK!

ALTER TABLE dbo.Answer 
  ADD CONSTRAINT FK_Answer_Question
  FOREIGN KEY(q_id) REFERENCES dbo.Question(q_id)

Пятый шаг - отбросить старый question_text столбец

ALTER TABLE dbo.Answer
  DROP COLUMN question_text

И конечно же - как всегда:

  • попробуйте сначала выполнить тестовую настройку
  • перед тем, как вы сделаете это на своем производстве, убедитесь, что имеет хотя бы одну самую последнюю резервную копию данных под рукой
1 голос
/ 17 декабря 2011

Попробуйте:

select a.a_id, q.q_id, a.answer_text
    into NewAnswer
    from Answer a, Question q
    where a.question_text = q.question_text;

После этого добавьте ограничения на NewAnswer, переименуйте Answer во что-то еще и NewAnswer в Answer.

[править: исправить синтаксис, согласно этой ссылке ]

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