好的,所有聪明的人,帮我解决这个问题。
我有一组我们正在进行的调查的相关表格:
dbo.Surveys
------------
| SurveyID |
------------
| 1 |
------------
dbo.Questions
-------------------------
| SurveyID | QuestionID |
-------------------------
| 1 | 1 |
-------------------------
| 1 | 2 |
-------------------------
| 1 | 3 |
-------------------------
dbo.Offerings
--------------------------------------
| SurveyID | QuestionID | OfferingID |
--------------------------------------
| 1 | 1 | 1 |
--------------------------------------
| 1 | 3 | 2 |
--------------------------------------
事实:
dbo.Surveys.SurveyID 是 IDENTITY
dbo.Questions.QuestionID 是 IDENTITY
dbo.Offerings.OfferingID 是 IDENTITY
我需要根据现有调查的副本创建一个新调查。
我得到一份 SurveyID 1 的副本并将其插入 dbo.Surveys,然后获得新的 SurveyID。
我得到一份与 SurveyID 1 相关的所有问题的副本,并将它们插入 dbo.Questions 并将 SurveyID 更改为新的。
这当然会为每条记录生成一个新的 QuestionID。
我获得了与 SurveyID 1 相关的所有产品的副本,并将它们插入 dbo.Offerings 并将 SurveyID 更改为新的。
现在的诀窍是,我如何知道哪个新的 OfferingID 与哪个新的 QuestionID 对应,以便我可以更新 dbo.Offerings 表中的 QuestionID?
所以,为了充实这一点,这就是我最终得到的:
dbo.Surveys
------------
| SurveyID |
------------
| 1 |
------------
| 2 |
------------
dbo.Questions
-------------------------
| SurveyID | QuestionID |
-------------------------
| 1 | 1 |
-------------------------
| 1 | 2 |
-------------------------
| 1 | 3 |
-------------------------
| 2 | 4 |
-------------------------
| 2 | 5 |
-------------------------
| 2 | 6 |
-------------------------
dbo.Offerings
--------------------------------------
| SurveyID | QuestionID | OfferingID |
--------------------------------------
| 1 | 1 | 1 |
--------------------------------------
| 1 | 3 | 2 |
--------------------------------------
| 2 | 1 | 3 | (QuestionID needs to be 4)
--------------------------------------
| 2 | 3 | 4 | (QuestionID needs to be 6)
--------------------------------------
编辑:好的。为了澄清起见:
CREATE TABLE Survey (SurveyID int identity, sname varchar(30));
CREATE TABLE Questions (QuestionID int IDENTITY, SurveyID int, qtext varchar(30), qtype varchar(20));
CREATE TABLE Offerings (OfferingID int IDENTITY, QuestionID int, SurveyID int, ovalues varchar(30));
INSERT INTO Survey VALUES ('New Survey');
INSERT INTO Questions VALUES (1,'Enter text','SingleAnswer');
INSERT INTO Questions VALUES (1,'Pick one','MultipleChoice');
INSERT INTO Offerings VALUES (2,1,'Choice 1');
INSERT INTO Offerings VALUES (2,1,'Choice 2');
INSERT INTO Offerings VALUES (2,1,'Choice 3');
SELECT * FROM Survey;
SELECT * FROM Questions;
SELECT * FROM Offerings;
SurveyID | sname
---------------------
1 | New Survey
QuestionID | SurveyID | qtext | qtype
---------------------------------------------------
1 | 1 | Enter text | SingleAnswer
2 | 1 | Pick one | MultipleChoice
OfferingID | QuestionID | SurveyID | ovalues
---------------------------------------------
1 | 2 | 1 | Choice 1
2 | 2 | 1 | Choice 2
3 | 2 | 1 | Choice 3
所以,现在我需要一份 SurveyID 1 的副本,这样:
SurveyID | sname
-----------------------
1 | New Survey
2 | New Survey 2
QuestionID | SurveyID | qtext | qtype
---------------------------------------------------
1 | 1 | Enter text | SingleAnswer
2 | 1 | Pick one | MultipleChoice
3 | 2 | Enter text | SingleAnswer
4 | 2 | Pick one | MultipleChoice
OfferingID | QuestionID | SurveyID | ovalues
---------------------------------------------
1 | 2 | 1 | Choice 1
2 | 2 | 1 | Choice 2
3 | 2 | 1 | Choice 3
4 | 4 | 2 | Choice 1
5 | 4 | 2 | Choice 2
6 | 4 | 2 | Choice 3
对原始问题的回应
暂时搁置我们 a) 不知道
get a copy of ...
需要什么和 b) 没有相关表的 DDL(例如,PK 定义)……我们将不得不稍微考虑一下……我们将从一些示例表和数据开始:
为了这个例子,我们将断言这
copy
意味着复制相同数量的行(调查、问题、产品)并将我们所有的文本值附加“(version_#2)”:结果:
这是上面的dbfiddle。
对更新/编辑问题的回应(添加 qtext/qtype/ovalues 列)
使用问题编辑部分中的相同命令
create table
和insert
命令,我们将重新使用我原始答案中的一些代码......注意:可能会将此
qmap
解决方案纳入我对原始问题的回答,但现在选择保留原始答案。结果:
这是上面的dbfiddle。