根据列比较将值从一个表复制到另一个表

时间:2011-12-17 16:18:58

标签: sql-server-2008-r2 copy

我在SQL Server 2008 R2中有一个问答表。

问题:

q_id
question_text

答案:

a_id
question_text
answer_text

这显然是糟糕的设计。 question_text字段在QuestionAnswer表中重复,AnswerQuestion之间没有外键关系。我想通过查找Question表中已存在的每个q_id的{​​{1}}(Answer)来创建此关系。我会通过将复制到Answer表的question_text值与Answer表中的行相匹配来完成此操作。

这是我想用伪代码做的事情。

  • Question表中创建一个可为空的q_id字段(可以为空,因为Answer表中已存在数据)
  • Answer表中选择所有内容。
  • 表示结果中的每一行 - 通过比较Answer值,从Question表中选择相应的问题。 - 将question_text插入q_id
  • 中可为空的q_id
  • Answer中的q_id列更改为不可为空。

你能帮助我在SQL Server 2008 R2中实现这一目标吗?感谢。

PS:Answer表中的所有question_text值都是唯一的。

2 个答案:

答案 0 :(得分:3)

第一步 - 创建新的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 :(得分:1)

尝试:

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

[编辑:修复语法,根据this link]