2012-02-15 17 views
5

Quindi ho questa tabella temporanea che ha struttura come:SQL inserire nel usando Unione dovrebbe aggiungere solo valori distinti

col1 col2 col3 col3 
intID1 intID2 intID3 bitAdd 

Sto facendo un unione dei valori di questa tabella temporanea con una query di selezione e memorizzazione nella stessa tabella temporanea. Il fatto è che col3 non fa parte della query di unione che mi verrà richiesto da in seguito per aggiornare la tabella.

Così sto facendo in questo modo:

Insert into #temptable 
(
intID1, 
intID2, 
intID3 
) 
select intID1,intID2,intID3 
From 
#temptable 

UNION 

select intID1,intID2,intID3 
From 
Table A 

Problema è che voglio solo le righe che non sono già esistenti nella tabella temporanea per essere added.Doing in questo modo si aggiunge un duplicato del già riga esistente (poiché unione restituirà una riga) Come inserisco solo le righe non presenti nella tabella temporanea corrente nella mia query di unione?

risposta

7

Nizza e semplice con EXCEPT

INSERT INTO #temptable (intID1, intID2, intID3) 
SELECT intID1,intID2,intID3 FROM TableA 
EXCEPT 
SELECT intID1,intID2,intID3 FROM #temptable 
+0

grazie ha funzionato alla grande! – user1212140

9

Uso MERGE:

MERGE INTO #temptable tmp 
USING (select intID1,intID2,intID3 From Table A) t 
ON (tmp.intID1 = t.intID1 and tmp.intID2 = t.intID2 and tmp.intID3 = t.intID3) 
WHEN NOT MATCHED THEN 
INSERT (intID1,intID2,intID3) 
VALUES (t.intID1,t.intID2,t.intID3) 
+0

grazie per la risposta, tuttavia sql server la versione utilizzata da noi è 2005. Non ero in grado di usare quella parola chiave. – user1212140

0

vedo dove si sono provenienti da. In molti linguaggi di programmazione #temptable sarebbe una variabile (variabile relazione o relvar in breve) a cui si desidera assegnare un valore (valore rapporto) così:

#temptable := #temptable UNION A 

Nel modello relazionale, ciò ottenere il risultato desiderato perché una relazione non ha righe duplicate per definizione.

Tuttavia, SQL non è veramente relazionale e non supporta l'assegnazione. Invece, è necessario aggiungere righe a una tabella usando le istruzioni SQL DML INSERT (che non è poi così male: gli utenti di un linguaggio di database veramente relazionale, se ne avessero uno, richiederebbero senza dubbio una simile abbreviazione per l'assegnazione relazionale!) Ma devi anche eseguire personalmente il test per i duplicati.

Le risposte di Daniel Hilgarth e Joachim Isaksson sembrano entrambe buone. È buona norma avere due risposte valide e logicamente valide per il candidato, quindi cercare i criteri (di solito prestazioni sotto carico tipico) per eliminarne uno (ma mantenerlo commentato per futuri test!)

+0

tat's true thanks! – user1212140

Problemi correlati