将父表中的每一行插入到子表中
我的数据库看起来像这样,
tblAudits
PK AuditID
AuditStatus nvarchar(50)
tblQuestionDefs
PK QuestionID
tblAuditAnswers
PK AnswerID
FK AuditID
FK QuestionID
我最近在审核中添加了一些新问题,并且我想为所有活动审核中的每个新问题添加答案记录。在 SQL 中执行此操作的最佳方法是什么?我知道我可以使用游标或循环,但据我所知,这些都非常慢。有什么基于集合的方法吗?
这是基于光标的代码
declare
@AuditID int
declare AuditsCursor cursor fast_forward for
select AuditID from tblAudits where AuditStatus='Issued' or AuditStatus='Pending' order by AuditID desc
open AuditsCursor
fetch next from AuditsCursor
into @AuditID
while @@FETCH_STATUS = 0
begin
insert into tblAuditAnswers (AuditID, QuestionID)
select @AuditID as AuditID, QuestionID
from tblQuestionDefs
where QuestionID not in (
select QuestionID from tblAuditAnswers where AuditID=@AuditID
)
fetch next from AuditsCursor
into @AuditID
end
close AuditsCursor
deallocate AuditsCursor
My DB looks like this
tblAudits
PK AuditID
AuditStatus nvarchar(50)
tblQuestionDefs
PK QuestionID
tblAuditAnswers
PK AnswerID
FK AuditID
FK QuestionID
I've recently added some new questions to the audits and I want to add an answer record for each new question to all active audits. What is the best way to do this in SQL? I know I can use cursors or loops, but those are both very slow AFAIK. Any set-based way to do it?
Here's the cursor based code
declare
@AuditID int
declare AuditsCursor cursor fast_forward for
select AuditID from tblAudits where AuditStatus='Issued' or AuditStatus='Pending' order by AuditID desc
open AuditsCursor
fetch next from AuditsCursor
into @AuditID
while @@FETCH_STATUS = 0
begin
insert into tblAuditAnswers (AuditID, QuestionID)
select @AuditID as AuditID, QuestionID
from tblQuestionDefs
where QuestionID not in (
select QuestionID from tblAuditAnswers where AuditID=@AuditID
)
fetch next from AuditsCursor
into @AuditID
end
close AuditsCursor
deallocate AuditsCursor
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
https://data.stackexchange.com/stackoverflow/q/123061/
https://data.stackexchange.com/stackoverflow/q/123061/
不需要游标。
如果问题定义与特定审核类型相关,那么您还应该将 CROSS JOIN 替换为 INNER JOIN:
There is no need for cursors.
If the question definitions are related to specific audit types, then you should also replace the CROSS JOIN by an INNER JOIN: