2010-02-18 4 views
14

Je crée un sproc qui insérer des lignes dans une « mise en scène » table avec un insert en + sous-requête comme ceci:sql insertion conditionnelle si la ligne n'existe pas déjà

INSERT INTO myStagingTable 
SELECT col1, col2, col3 
FROM myRealTable 

je dois mettre un conditionnellement là pour déterminer si la valeur de col1 par exemple existe déjà sur myStagingTable, alors ne l'insérez pas, sautez simplement cette ligne de myRealTable.

est-ce possible? Si oui, comment pourrais-je structurer cela?

TIA

Répondre

16
INSERT 
INTO myStagingTable 
SELECT col1, col2, col3 
FROM myRealTable rt 
WHERE NOT EXISTS 
     (
     SELECT rt.col1, rt.col2, rt.col3 
     INTERSECT 
     SELECT col1, col2, col3 
     FROM myStagingTable 
     ) 

Cela traitera tous les doublons (y compris NULL)

Notez que est insérera les doublons de la table réelle est tout. Dites si la vraie table contient

1 1 1 
1 1 1 

et la table de mise en scène contient

2 2 2 

, seront insérés les deux enregistrements avec 1, 1, 1.

Si vous voulez éliminer les doublons à l'insertion (de sorte que seule une instance de 1, 1, 1 est inséré), puis il suffit d'utiliser ceci:

INSERT 
INTO myStagingTable 
SELECT col1, col2, col3 
FROM myRealTable 
EXCEPT 
SELECT col1, col2, col3 
FROM myStagingTable 
+0

pas Si vous spécifiez les colonnes sélectionnées sur les deux côtés de la INTSERSECT clause? Et s'il y a quatre cols dans myRealTable? –

+0

@Philip: bien sûr, était juste de corriger cela :) – Quassnoi

+0

il semble INTERSECT et EXCEPT ne sont pas pris en charge dans SQL2000 ... – jiaoziren

Questions connexes