2014-11-11 3 views
0
CREATE TABLE [CandidateDocsAssociation](
[Row_ID] [bigint] IDENTITY(1,1) NOT NULL, 
[Doc_ID] [bigint] NOT NULL, 
[Candidate_ID] [bigint] NOT NULL, 
) ON [PRIMARY] 
GO 

본인은 위의 테이블 구조를 사용하여 문서와 후보자 간의 연결을 저장합니다. Row_ID는 자동 생성 기본 키입니다. Doc_ID는 문서 테이블을 참조하는 외래 키입니다. 또한 Candidate_ID는 후보 테이블을 참조하는 외래 키입니다.WHILE EXISTS를 루프로 사용하는 방법

후보는 둘 이상의 문서와 연관 될 수 있으며 한 문서는 여러 후보와 연관 될 수 있습니다.

DOC_ID가 2 인 Candidate_ID 행이 아직 존재하지 않으면 모든 후보 (DISTINCT)에 대해 기본 공통 문서 (Doc_ID)를 삽입하고 싶습니다. 다음은

내가 노력하고있어하지만이 함께

WHILE EXISTS (SELECT DISTINCT Candidate_ID from CandidateDocsAssociation 
    WHERE Doc_ID <> (SELECT Doc_ID FROM Doc_Table WHERE Doc_Name = N'Default')) 
    BEGIN 
    INSERT CandidateDocsAssociation (Doc_ID, Candidate_ID) VALUES ((SELECT Doc_ID FROM Doc_Table WHERE Doc_Name = N'Default'),Candidate_ID) 
    END 
    GO 

답변

1

루프를 잊어 버려 (절에 사용하지 않는)와 집합 기반 작업을 할 것입니다 . 응시자 테이블이 있다고 가정하면 :

INSERT INTO CandidateDocsAssociation (Doc_ID, Candidate_ID) 
    SELECT dt.Doc_ID, c.Candidate_ID 
    FROM Doc_Table dt 
    CROSS JOIN Candidates c 
    WHERE dt.Doc_Name = N'Default' 
    AND NOT EXISTS(SELECT * FROM CandidateDocsAssociation cda 
    WHERE cda.Candidate_ID=c.Candidate_ID 
    AND cda.Doc_ID=dt.Doc_ID) 
0

시도를 작동하지

WHILE EXISTS (SELECT DISTINCT Candidate_ID from CandidateDocsAssociation 
    WHERE Doc_ID NOT IN (SELECT Doc_ID FROM Doc_Table WHERE Doc_Name = N'Default')) 
    BEGIN 
    INSERT CandidateDocsAssociation (Doc_ID, Candidate_ID) VALUES ((SELECT Doc_ID FROM Doc_Table WHERE Doc_Name = N'Default'),Candidate_ID) 
    END 
    GO 
관련 문제