2010-08-02 4 views
0

J'essaie d'utiliser une instruction d'insertion SQL pour migrer des lignes d'une table dans une base de données vers une table dans une base de données différente. L'instruction fonctionne jusqu'à ce que j'ajoute un index unique sur la table de destination et à ce point je me bats pour obtenir l'instruction d'insertion pour pouvoir exclure les doubles. Voici ce que je pensais travaillerais:Empêche l'insertion de lignes en double

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) 

Le schéma de la table HPB est:

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) 

L'index unique est le [MyDB] [dbo] [HPB] table pour les colonnes (.. HPID, BusinessID)

Lorsque j'exécute l'insertion, j'obtiens une erreur à propos des insertions de ligne en double et je n'arrive pas à comprendre pourquoi le SQL ci-dessous n'exclut pas les doublons.

NOT EXISTS (SELECT * FROM [MyDB].[dbo].[HPB] WHERE 
    [HPID] = (SELECT ID FROM [MyDB].[dbo].[HP] WHERE PersonID = lPersonId) 
    AND [BusinessID] = lBusinessId) 

Répondre

2
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 
+0

+1: Bien fait! –

+0

Rappelez-vous que LEFT JOIN/IS NULL est seulement plus rapide sur MySQL - sur SQL Server, NOT IN et NOT EXISTS sont plus efficaces: http://explainextended.com/2009/09/15/not-in-vs-not- existe-vs-gauche-join-est-null-sql-server/ –

+0

@OMG Poneys - Je ne savais pas à propos de la différence de perf de Left Join vs. Exists. Je suppose que j'ai toujours eu l'habitude de tester le plan d'exécution de chacun afin de voir lequel est le plus efficace. Certes, cela pousse ma mémoire, mais je me souviens de certaines situations, sur SQL Server, où une jointure à gauche et null était plus rapide qu'un Exists et d'autres où l'inverse était vrai. Peut-être, c'était simplement une perception. – Thomas

2

Utilisation:

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) 
+0

Le mot-clé DISTINCT est ce que je avais besoin puisque la clause NOT EXISTS n'empêche pas une nouvelle ligne et son double à la fois être ajouté dans le même lot. – jk7

Questions connexes