2012-02-15 9 views
5

więc mam tej tabeli temp, który ma strukturę jak:SQL wstawić do korzystania Unia powinna dodawać tylko odrębne wartości

col1 col2 col3 col3 
intID1 intID2 intID3 bitAdd 

Robię unię wartości tej tabeli temp z kwerendy wybierającej i przechowywania do tej samej tabeli temp. Rzecz polega na tym, że col3 nie jest częścią zapytania związkowego. Będę potrzebował później zaktualizować tabelę.

Więc robie tak:

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

UNION 

select intID1,intID2,intID3 
From 
Table A 

Problem jest, że chcę tylko wiersze, które nie są już istniejących w tabeli temp być added.Doing to w ten sposób doda duplikat już istniejący wiersz (ponieważ union zwróci jeden wiersz) Jak wstawić tylko te wiersze, które nie istnieją w aktualnej tabeli tymczasowej w moim zapytaniu o połączenie?

Odpowiedz

7

Ładne i proste z EXCEPT

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

dzięki działało świetnie! – user1212140

9

Zastosowanie 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

dzięki za odpowiedź, jednak serwer sql Używana przez nas wersja to 2005. Nie mogłem użyć tego słowa kluczowego. – user1212140

0

widzę, gdzie jesteś. W większości języków programowania #temptable byłoby zmiennej (zmienna związku lub relvar w skrócie), do którego chcesz przypisać wartość (wartość relacja) w następujący sposób:

#temptable := #temptable UNION A 

w modelu relacyjnym, by to osiągnąć pożądany rezultat ponieważ relacja nie ma duplikatów z definicji.

Jednak SQL nie jest prawdziwie relacyjny i nie obsługuje przypisania. Zamiast tego, musisz dodawać wiersze do tabeli, używając instrukcji SQL DML INSERT (co nie jest takie złe: użytkownicy prawdziwie relacyjnego języka baz danych, gdybyśmy je mieli, bez wątpienia wymagaliby podobnego stenogramu dla przypisania relacyjnego!), Ale musisz także sam wykonać test duplikatów.

Odpowiedzi od Daniela Hilgarth i Joachima Isakssona wyglądają dobrze. Dobrą praktyką jest posiadanie dwóch dobrych, logicznie brzmiących kandydackich odpowiedzi, a następnie szukanie kryteriów (zazwyczaj wydajności pod typowym obciążeniem) w celu wyeliminowania jednego (ale zachowując to skomentowano do przyszłego ponownego testowania!)

+0

tat to prawdziwe dzięki! – user1212140

Powiązane problemy