sql-server - 如何从 Table1 插入到 Table2,然后使用插入的 ID 插入到 Table3

标签 sql-server database sql-server-2014

我有一些表存储了以下数据,这些数据与我实际拥有的不完全相同,但经过简化以便更容易解释。

表1

  • 用户 ID (FK)
  • 测试ID(FK)
  • 开始时间
  • 结束时间
  • 问题ID1
  • AnswerToQuestion1
  • 问题ID2
  • AnswerToQuestion2

因为Table1是一个电子表格,所以我想将这个数据导入到两个表中(Table2和Table3)

表2

  • 用户测试 ID (PK)
  • 用户名
  • 测试ID
  • 开始时间
  • 结束时间

表3

  • 用户测试 ID (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,但它不起作用,因为它不允许我选择那些未用于插入到 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为了这。如果您没有两个要插入的行条目,则可以在一条语句中完成所有操作 - 因此您可以转储到临时表并执行以下操作:

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;

关于sql-server - 如何从 Table1 插入到 Table2,然后使用插入的 ID 插入到 Table3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30470488/

相关文章:

sql-server - SQL Server Express - 商业用途

c# - 以编程方式将 SQLite 转换为 .sql

c# - 为什么 SQL Server 数据库用户写入错误的架构?

sql-server - 2014 SQL Server 连接到本地网络上的不同 PC。 VBA

sql-server - SQL Server 2008 - 将 XML 声明添加到 XML 输出

sql-server - 如何在 IIF 或另一个子查询中引用我的子查询值,而不必再次将其全部写出?

C# 将 UTC int 转换为 DateTime 对象

php - 无法使用 php 从 mysql 获取数据到 html 表,显示内部服务器错误

php - 如何从 codeigniter 调用两个或多个表并发送或加载以查看