代码之家  ›  专栏  ›  技术社区  ›  sipsorcery

防止插入重复行

  •  0
  • sipsorcery  · 技术社区  · 14 年前

    INSERT INTO [MyDB].[dbo].[HPB] (
        [HPID],
        [BusinessID]
    )
    SELECT 
        PersonId = (SELECT ID FROM [MyDB].[dbo].[HP] WHERE PersonID = lPersonId),
        lBusinessId
    FROM [MyOriginalDB].[dbo].[tblEmployment]
    WHERE
        lPersonId in (SELECT PersonID FROM [MyDB].[dbo].[HP])
    AND
        lBusinessId in (SELECT ID FROM [MyDB].[dbo].[Business])
    AND 
       NOT EXISTS (SELECT * FROM [MyDB].[dbo].[HPB] WHERE 
         [HPID] = (SELECT ID FROM [MyDB].[dbo].[HP] WHERE PersonID = lPersonId) 
         AND [BusinessID] = lBusinessId)
    

    HPB表的架构为:

    CREATE TABLE [dbo].[HPB](
       [ID] [int] IDENTITY(1,1) NOT NULL,
       [HPID] [int] NOT NULL,
       [BusinessID] [int] NOT NULL,
       CONSTRAINT [PK_HealthProfessionalBusiness] PRIMARY KEY CLUSTERED)
    

    当我运行insert时,我得到了一个关于重复行插入的错误,我无法理解为什么下面的SQL不排除重复行。

     NOT EXISTS (SELECT * FROM [MyDB].[dbo].[HPB] WHERE 
         [HPID] = (SELECT ID FROM [MyDB].[dbo].[HP] WHERE PersonID = lPersonId) 
         AND [BusinessID] = lBusinessId)
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   Thomas    14 年前
    Insert MyDB.dbo.HPB( HPID, BusinessID )  
    Select HP.ID, E.IBusinessID  
    From [MyOriginalDB].[dbo].[tblEmployment] As E
        Join [MyDB].[dbo].[HP] As HP
            On HP.PersonId = E.IPersonID
        Join [MyDB].[dbo].[Business] As B
            On B.ID = E.IBusinessID
        Left Join [MyDB].[dbo].[HPB] As HPB
            On HPB.BusinessID = E.IBusinessID
                And HPB.PersonID = E.IPersonId
    Where HPB.ID Is Null
    Group By HP.ID, E.IBusinessID
    
        2
  •  2
  •   OMG Ponies    14 年前

    用途:

    INSERT INTO [MyDB].[dbo].[HPB] 
      ([HPID], [BusinessID])
    SELECT DISTINCT
           h.id,
           e.lbusinessid
      FROM [MyOriginalDB].[dbo].[tblEmployment] e
      JOIN [MyDB].[dbo].[HP] h ON h.personid = e.lpersonid
     WHERE e.lbusinessid in (SELECT ID FROM [MyDB].[dbo].[Business])
       AND NOT EXISTS (SELECT NULL 
                         FROM [MyDB].[dbo].[HPB] hb
                        WHERE hb.businessid = e.lbusinessid
                          AND hb.hpid = h.id)