如何从 Table1 插入到 Table2,然后使用插入的 ID 插入到 Table3
How do I insert into Table2 from Table1 and then use the inserted ID to insert into Table3
我有一些表存储了以下数据,这与我实际拥有的不完全相同,但经过简化以便更容易解释..
表 1
- 用户 ID (FK)
- 测试 ID (FK)
- 开始时间
- 结束时间
- 问题 ID1
- AnswerToQuestion1
- 问题 ID2
- AnswerToQuestion2
由于 Table1 是电子表格,我想将此数据导入两个表(Table2 和 Table3)
表 2
- UserTestID (PK)
- 用户ID
- 测试ID
- 开始时间
- 结束时间
表 3
- UserTestID (FK)
- 问题 ID (FK)
- AnswerID (FK)
我想做的是...
我想对表 1 中的每一行执行以下插入操作。
INSERT INTO Table2
(
UserID
,TestID
,StartTime
,EndTime
)
SELECT UserID
,TestID
,StartTime
,EndTime
FROM Table1
Declare @InsertedUserTestID INT
Set @id = SCOPE_IDENTITY()
-- Do this twice (once for Question1 and the second for Question2)
INSERT INTO Table3
(
UserTestID
,QuestionID
,AnswerID
)
SELECT
@id
,QuestionID1
,AnswerToQuestion1
FROM Table1
我试过的
我读到我可以使用 OUTPUT 来使用插入的 ID,但它不起作用,因为它不允许我 select 那些未用于插入到 Table2 中的列。
INSERT INTO Table2
(
UserID
,TestID
,StartTime
,EndTime
)
OUTPUT Inserted.UserTestID
INTO Table3(Inserted.UserTestID, QuestionID1, AnswerToQuestion1)
SELECT UserID
,TestID
,StartTime
,EndTime
FROM Table1
有什么办法可以实现吗?还是先从Table1插入到Table2,再用Table1和Table2插入到Table3?
Martin 是对的 - 为此使用 MERGE。如果您没有两个要插入的行条目,则可以在一条语句中完成所有操作 - 因此您可以转储到临时 table 并执行以下操作:
CREATE TABLE #answers (UserTestID INT, QuestionID1 INT, AnswerID1 INT, QuestionID2 INT, AnswerID2 INT);
MERGE Table2
USING
(
SELECT UserID
,TestID
,StartTime
,EndTime
,QuestionID1
,AnswerToQuestion1
,QuestionID2
,AnswerToQuestion2
FROM Table1
) src ON (1=0)
WHEN NOT MATCHED THEN INSERT (UserID, TestID, StartTime, EndTime)
VALUES (src.UserID, src.TestID, src.StartTime, src.EndTime
OUTPUT Inserted.UserTestID, src.QuestionID1, src.AnswerID1, src.QuestionID2, src.AnswerID2
INTO #answers(UserTestID, QuestionID1, AnswerID1, QuestionID2, AnswerID2);
INSERT INTO Table3
(
UserTestID
,QuestionID
,AnswerID
)
SELECT UserTestID
,QuestionID1
,AnswerID1
FROM #answers
UNION
SELECT UserTestID
,QuestionID2
,AnswerID2
FROM #answers;
我有一些表存储了以下数据,这与我实际拥有的不完全相同,但经过简化以便更容易解释..
表 1
- 用户 ID (FK)
- 测试 ID (FK)
- 开始时间
- 结束时间
- 问题 ID1
- AnswerToQuestion1
- 问题 ID2
- AnswerToQuestion2
由于 Table1 是电子表格,我想将此数据导入两个表(Table2 和 Table3)
表 2
- UserTestID (PK)
- 用户ID
- 测试ID
- 开始时间
- 结束时间
表 3
- UserTestID (FK)
- 问题 ID (FK)
- AnswerID (FK)
我想做的是...
我想对表 1 中的每一行执行以下插入操作。
INSERT INTO Table2
(
UserID
,TestID
,StartTime
,EndTime
)
SELECT UserID
,TestID
,StartTime
,EndTime
FROM Table1
Declare @InsertedUserTestID INT
Set @id = SCOPE_IDENTITY()
-- Do this twice (once for Question1 and the second for Question2)
INSERT INTO Table3
(
UserTestID
,QuestionID
,AnswerID
)
SELECT
@id
,QuestionID1
,AnswerToQuestion1
FROM Table1
我试过的
我读到我可以使用 OUTPUT 来使用插入的 ID,但它不起作用,因为它不允许我 select 那些未用于插入到 Table2 中的列。
INSERT INTO Table2
(
UserID
,TestID
,StartTime
,EndTime
)
OUTPUT Inserted.UserTestID
INTO Table3(Inserted.UserTestID, QuestionID1, AnswerToQuestion1)
SELECT UserID
,TestID
,StartTime
,EndTime
FROM Table1
有什么办法可以实现吗?还是先从Table1插入到Table2,再用Table1和Table2插入到Table3?
Martin 是对的 - 为此使用 MERGE。如果您没有两个要插入的行条目,则可以在一条语句中完成所有操作 - 因此您可以转储到临时 table 并执行以下操作:
CREATE TABLE #answers (UserTestID INT, QuestionID1 INT, AnswerID1 INT, QuestionID2 INT, AnswerID2 INT);
MERGE Table2
USING
(
SELECT UserID
,TestID
,StartTime
,EndTime
,QuestionID1
,AnswerToQuestion1
,QuestionID2
,AnswerToQuestion2
FROM Table1
) src ON (1=0)
WHEN NOT MATCHED THEN INSERT (UserID, TestID, StartTime, EndTime)
VALUES (src.UserID, src.TestID, src.StartTime, src.EndTime
OUTPUT Inserted.UserTestID, src.QuestionID1, src.AnswerID1, src.QuestionID2, src.AnswerID2
INTO #answers(UserTestID, QuestionID1, AnswerID1, QuestionID2, AnswerID2);
INSERT INTO Table3
(
UserTestID
,QuestionID
,AnswerID
)
SELECT UserTestID
,QuestionID1
,AnswerID1
FROM #answers
UNION
SELECT UserTestID
,QuestionID2
,AnswerID2
FROM #answers;