2010-02-18 7 views
14

ich eine sproc bin erstellen, die Zeilen in einen ‚Inszenierung‘ Tisch mit einem Einsatz in + Unterabfrage wie so einfügen wird:SQL bedingter Einsatz, wenn Zeile nicht existiert bereits

INSERT INTO myStagingTable 
SELECT col1, col2, col3 
FROM myRealTable 

Ich habe muß eine bedingt in da irgendwie zu bestimmen, ob der Wert von Col1 zum Beispiel bereits auf myStagingTable existiert, dann fügen Sie es nicht ein, einfach überspringen Sie diese Zeile von myRealTable.

ist das möglich? Wenn ja, wie würde ich das strukturieren?

TIA

Antwort

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 
     ) 

Dadurch werden alle Duplikate behandeln (einschließlich NULL)

Beachten Sie, dass die Duplikate aus der realen Tabelle fügt ist vorhanden. Sagen, wenn die reale Tabelle

1 1 1 
1 1 1 

und die Zwischenspeichertabelle enthält

2 2 2 

, beide Datensätze mit 1, 1, 1 eingefügt werden enthält.

Wenn Sie die Duplikate auf Einsatz beseitigen wollen (so dass nur eine Instanz von 1, 1, 1 eingeführt wird), dann benutzen Sie einfach diese:

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

Sollten Sie nicht die Spalten auf beiden Seiten des INTSERSECT ausgewählt angeben Klausel? Was ist, wenn es in myRealTable vier Spalten gibt? –

+0

@Philip: sicher, war gerade das korrigieren :) – Quassnoi

+0

es scheint INTERSECT und EXCEPT werden nicht in SQL2000 unterstützt ... – jiaoziren

Verwandte Themen