如何在循环中使用WHILE EXISTS

时间:2014-11-11 14:22:31

标签: tsql sql-server-2005

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也是引用Candidates表的外键。

候选人可以与多个文件相关联,一个文件可以与多个候选人相关联。

我想要实现的是,如果尚未存在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

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

试试这个(使用NOT IN Clause)

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