Ok, todos vocês, pessoas inteligentes, me ajudem a descobrir isso.
Eu tenho um conjunto de tabelas relacionadas para pesquisas que estamos fazendo:
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 |
--------------------------------------
Fatos:
dbo.Surveys.SurveyID é IDENTIDADE
dbo.Questions.QuestionID é IDENTITY
dbo.Offerings.OfferingID é IDENTITY
Preciso criar uma nova pesquisa com base em uma cópia de uma já existente.
Recebo uma cópia do SurveyID 1 e insiro-o em dbo.Surveys, em seguida, recebo o novo SurveyID.
Recebo uma cópia de todas as perguntas relacionadas ao SurveyID 1 e as insiro em dbo.Questions e altero o SurveyID para o novo.
Isso, obviamente, gera um novo QuestionID para cada registro.
Recebo uma cópia de todas as ofertas relacionadas ao SurveyID 1 e as insiro em dbo.Offerings e altero o SurveyID para o novo.
O truque agora é: como saber qual novo OfferID combina com qual novo QuestionID para que eu possa atualizar o QuestionID na tabela dbo.Offerings?
Então, para aprofundar isso, é isso que eu acabo com:
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)
--------------------------------------
EDIT: Ok. A título de esclarecimento:
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
Então, agora eu preciso de uma cópia do SurveyID 1 tal que:
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
Resposta à pergunta original
Deixando de lado por enquanto que a) não sabemos o que
get a copy of ...
implica eb) não temos o DDL para as tabelas em questão (por exemplo, definições de PK) ... teremos que improvisar um pouco ...Começaremos com algumas tabelas e dados de amostra:
Para este exemplo, afirmaremos que
copy
significa duplicar o mesmo número de linhas (Pesquisa, Perguntas, Ofertas) e anexar todos os nossos valores de texto com ' (versão_#2)':E os resultados:
Aqui está um dbfiddle do acima.
Resposta à pergunta atualizada/editada (adição de colunas qtext/qtype/ovalues)
Usando o mesmo
create table
e osinsert
comandos da parte editada da pergunta, reutilizaremos parte do código da minha resposta original ...NOTA: Provavelmente poderia rolar esta
qmap
solução na minha resposta à pergunta original, mas optando por deixar a resposta original como está por enquanto.E os resultados:
Aqui está um dbfiddle para o acima.