Sql server 2008 r2 基于列比较将值从一个表复制到另一个表

Sql server 2008 r2 基于列比较将值从一个表复制到另一个表,sql-server-2008-r2,copy,Sql Server 2008 R2,Copy,我在SQLServer2008R2中有一个问答表 问题: 答复: 这显然是个糟糕的设计。问答表中的问题\文本字段重复,并且答案和问题之间没有外键关系。我想通过查找问题来创建这种关系,即找到答案表中已经存在的每个答案的q_id。我将通过将复制到答案表的question_文本值与question表中的行相匹配来实现这一点 这是我想在伪代码中做的 在应答表中创建一个可为空的q_id字段可为空,因为应答表中已有数据 从答案表中选择所有内容。 对于结果中的每一行 -通过比较问题\文本值,从问题表中选择相应

我在SQLServer2008R2中有一个问答表

问题:

答复:

这显然是个糟糕的设计。问答表中的问题\文本字段重复,并且答案和问题之间没有外键关系。我想通过查找问题来创建这种关系,即找到答案表中已经存在的每个答案的q_id。我将通过将复制到答案表的question_文本值与question表中的行相匹配来实现这一点

这是我想在伪代码中做的

在应答表中创建一个可为空的q_id字段可为空,因为应答表中已有数据 从答案表中选择所有内容。 对于结果中的每一行 -通过比较问题\文本值,从问题表中选择相应的问题。 -将q_id插入应答表中可为空的q_id列 将答案中的q_id列更改为不可为null。 您能帮我在SQL Server 2008 R2中实现这一点吗?谢谢


备注:问题表中的所有问题文本值都是唯一的。

第一步-创建新的q\u id列:

第二步-根据问题文本进行更新

第三步-如果没有任何空值:

ALTER TABLE dbo.Answer ALTER COLUMN q_id INT NOT NULL
第四步-建立FK链接

第五步-删除旧的“问题”文本列

当然,一如既往:

首先在测试设置上尝试此操作 在生产中执行此操作之前,请确保手头至少有一个最新的数据备份
第一步-创建新的q_id列:

第二步-根据问题文本进行更新

第三步-如果没有任何空值:

ALTER TABLE dbo.Answer ALTER COLUMN q_id INT NOT NULL
第四步-建立FK链接

第五步-删除旧的“问题”文本列

当然,一如既往:

首先在测试设置上尝试此操作 在生产中执行此操作之前,请确保手头至少有一个最新的数据备份 尝试:

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

[编辑:根据修改语法]

尝试:

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


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

Hmm,为什么不使用创建另一个表?创建表格newanswer作为select blabla,然后将答案重命名为answer.old和newanswer to answer?您好,答案表格中已经有数据,因此我需要以某种方式将现有答案与他们的问题连接起来。我能做到这一点的唯一方法是查看问题的文本值,因为它已被复制到答案表中。好吧,我的解决方案不会丢失答案表中的数据!好的,看看答案。嗯,为什么不使用创建另一个表呢?创建表格newanswer作为select blabla,然后将答案重命名为answer.old和newanswer to answer?您好,答案表格中已经有数据,因此我需要以某种方式将现有答案与他们的问题连接起来。我能做到这一点的唯一方法是查看问题的文本值,因为它已被复制到答案表中。好吧,我的解决方案不会丢失答案表中的数据!好的,看看答案。我认为这应该是一个很好的解决方案。但是,SQL Server抱怨“as”附近出现语法错误。它期待着一个好天气。我把所有的东西都放在括号中的“as”后面,但是没有运气。它一直在抱怨。请参阅后期编辑。事实上,按select创建表仅适用于Oracle。我认为这应该是一个很好的解决方案。但是,SQL Server抱怨“as”附近出现语法错误。它期待着一个好天气。我把所有的东西都放在括号中的“as”后面,但是没有运气。它一直在抱怨。请参阅后期编辑。事实上,创建表作为select仅限于Oracle。你的答案看起来也不错。但是,在开始添加新的q_id字段后,SQL Server无法识别新字段。我不知道为什么会这样。在第二个更新查询中,q_id字段在表中时以红色下划线。奇怪。,@Julius:你需要在每一步之间都有一个穿插,你不可能同时跑完所有的步骤。这就是SQL Server的工作方式……你好,马克。你的答案看起来也不错。但是,在开始添加新的q_id字段后,SQL Server无法识别新字段。我不知道为什么会这样。在第二个更新查询中,q_id字段在表中时以红色下划线。奇怪。,@Julius:你需要在每一步之间都有一个穿插,你不可能同时跑完所有的步骤。这就是SQL Server的工作方式。。。。。
ALTER TABLE dbo.Answer ALTER COLUMN q_id INT NOT NULL
ALTER TABLE dbo.Answer 
  ADD CONSTRAINT FK_Answer_Question
  FOREIGN KEY(q_id) REFERENCES dbo.Question(q_id)
ALTER TABLE dbo.Answer
  DROP COLUMN question_text
select a.a_id, q.q_id, a.answer_text
    into NewAnswer
    from Answer a, Question q
    where a.question_text = q.question_text;