【问题标题】:How to use WHILE EXISTS in a loop如何在循环中使用 WHILE EXISTS
【发布时间】:2015-01-08 03:06:59
【问题描述】:
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

【问题讨论】:

    标签: tsql sql-server-2005


    【解决方案1】:

    试试这个(使用 NOT IN 子句)

    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
    

    【讨论】:

      【解决方案2】:

      忘记循环并执行基于集合的操作。假设您有一个 Candidates 表:

        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)
      

      【讨论】:

        猜你喜欢
        • 2013-09-30
        • 2016-10-27
        • 2011-11-29
        • 2014-11-01
        • 1970-01-01
        • 2018-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多