2012-01-02 3 views
2

내 DB이내가 최근 감사에 몇 가지 새로운 질문을 추가 한

tblAudits 
PK AuditID 
AuditStatus nvarchar(50) 

tblQuestionDefs 
PK QuestionID 

tblAuditAnswers 
PK AnswerID 
FK AuditID 
FK QuestionID 

처럼 보이는 부모 테이블의 모든 행에 대해 자식 테이블에 삽입하고 나는 각각의 새로운 질문에 대한 답변 레코드를 추가 할 모든 능동적 인 감사. SQL에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 내가 커서 또는 루프을 사용할 수 있지만 모두 매우 느린 AFAIK입니다. 어떤 세트 기반의 방법으로 그것을 할 수 있습니까?

여기에 커서 기반의 코드

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 [email protected] 
    ) 

fetch next from AuditsCursor 
into @AuditID 
end 

close AuditsCursor 
deallocate AuditsCursor 

답변

3
insert into tblAuditAnswers (AuditID, QuestionID) 
select A.AuditID, QD.QuestionID 
from tblAudits as A 
    cross join tblQuestionDefs as QD 
where (A.AuditStatus='Issued' or A.AuditStatus='Pending') and 
     not exists (select * 
        from tblAuditAnswers as AA 
        where QD.QuestionID = AA.QuestionID and 
          A.AuditID = AA.AuditID) 

http://data.stackexchange.com/stackoverflow/q/123061/

2
INSERT INTO tblAuditAnswers 
      (AuditID, 
      QuestionID) 
SELECT A.AuditID, 
     Q.QuestionID 
FROM tblAudits A 
     CROSS JOIN (SELECT QuestionID 
        FROM tblQuestionDefs 
        EXCEPT 
        SELECT QuestionID 
        FROM tblAuditAnswers) Q 
WHERE A.AuditStatus IN ('Issued', 'Pending') 
+0

일 - 아주 좋은 대답. 왜 나는 항상 '예외'와 '간섭'을 잊을 지 모르겠다. – Lamak

+1

@ 마틴 스미스 굉장! Cross Audit이 현재 감사 (예 : A.AuditID)에 대해 tblAuditAnswers의 QuestionID 만 선택하는 방법을 설명 할 수 있습니까? –

+1

@ just.another.programmer - "새로운 질문마다 답변 레코드를 모든 활성 감사에 추가하려고합니다."라고 말하고 싶습니다. 파생 테이블'Q'는 모든 새로운 질문을 포함합니다. ('tblAuditAnswers'에 아직 대응하는 엔트리가없는'tblQuestionDefs'에서 새로운 것으로 가정 됨). 만약'X' 행을 반환하고'tblAudits'에 대한 질의에 의해'Y' 행이 반환되면 액티브 감사를 찾으면 크로스 조인은 두 결과의 모든 조합에 대해'X * Y' 행을 반환합니다. –

0

커서에 대한 필요가 없습니다에게 있습니다.

INSERT INTO tblAuditAnswers 
    (AuditID, QuestionID) 
SELECT 
    A.AuditID, Q.QuestionID 
FROM 
    tblAudits A 
    CROSS JOIN tblQuestionDefs Q 
    LEFT JOIN tblAuditAnswers AA 
     ON A.AuditID = AA.AuditID AND Q.QuestionID = AA.QuestionID 
WHERE 
    A.AuditStatus='Issued' OR A.AuditStatus='Pending' AND 
    AA.AuditID IS NULL 
ORDER BY 
    A.AuditID DESC 

질문 정의는 특정 감사 유형에 관련된 경우에, 당신은 또한 CROSS이 내부로 가입 교체해야 가입 :

INNER JOIN tblQuestionDefs Q 
    A.AuditTypeID = Q.AuditTypeID 
관련 문제