将文档与Candidate_Document表中的所有候选人相关联

时间:2014-11-11 13:23:24

标签: sql-server tsql

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

1 个答案:

答案 0 :(得分:0)

忘掉while循环,SQL是关于set操作的,所以你必须调整你的想法。您需要的是没有关联id = 2的文档的候选集。对于每个此类候选项,您需要创建与默认文档的关联。让我们试着写下来:

INSERT INTO [CandidateDocsAssociation] VALUES([Candidate_ID], [Doc_ID])
SELECT [Candidate_ID], 2
FROM [Candidate] c  -- I assume you have table of all candidates
WHERE NOT EXISTS (
  SELECT * FROM [CandidateDocsAssociation] a
  WHERE a.[Candidate_ID] = c.[Candidate_ID] AND a.[Doc_ID] = 2
)