Mam następujące dwie tabele:
Table1
----------
ID Name
1 A
2 B
3 C
Table2
----------
ID Name
1 Z
Muszę wstawić dane od Table1
do Table2
. Mogę użyć następującej składni:
INSERT INTO Table2(Id, Name) SELECT Id, Name FROM Table1
Jednak w moim przypadku zduplikowane identyfikatory mogą istnieć w Table2
(w moim przypadku jest to po prostu „ 1
”) i nie chcę ich ponownie kopiować, ponieważ spowodowałoby to błąd.
Mogę napisać coś takiego:
IF NOT EXISTS(SELECT 1 FROM Table2 WHERE Id=1)
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1
ELSE
INSERT INTO Table2 (Id, name) SELECT Id, name FROM Table1 WHERE Table1.Id<>1
Czy jest lepszy sposób na zrobienie tego bez używania IF - ELSE
? Chcę uniknąć dwóch INSERT INTO-SELECT
stwierdzeń opartych na jakimś warunku.
sql
sql-server
tsql
sql-insert
Ashish Gupta
źródło
źródło
NOT EXISTS
jest szczególnie przydatny ze złożonym kluczem podstawowym,NOT IN
nie zadziała wtedyW MySQL możesz to zrobić:
Czy SQL Server ma coś podobnego?
źródło
Właśnie miałem podobny problem, słowo kluczowe DISTINCT działa magicznie:
źródło
insert into
tabeli.Ostatnio miałem ten sam problem ...
Oto co działało u mnie w MS SQL serwerze 2017 ...
Klucz podstawowy powinien być ustawiony na ID w tabeli 2 ...
Kolumny i właściwości kolumn powinny być oczywiście takie same w obu stoły. To zadziała przy pierwszym uruchomieniu poniższego skryptu. Powielony identyfikator w tabeli 1 nie wstawi ...
Jeśli uruchomisz go po raz drugi, otrzymasz plik
To jest kod:
źródło
Korzystanie
ignore Duplicates
z unikalnego indeksu, zgodnie z sugestią IanC, było moim rozwiązaniem podobnego problemu, tworząc indeks z opcjąWITH IGNORE_DUP_KEY
Ref .: opcja_indeksu
źródło
W SQL Server możesz ustawić unikalny indeks klucza w tabeli dla (Kolumny, które muszą być unikalne)
źródło
Trochę nie na temat, ale jeśli chcesz przenieść dane do nowej tabeli, a możliwe duplikaty znajdują się w oryginalnej tabeli , a kolumna prawdopodobnie zduplikowana nie jest identyfikatorem,
GROUP BY
zrobi to:źródło
Wystarczyłoby proste,
DELETE
zanimINSERT
:Przełączanie
Table1
wTable2
zależności od tego, który stółId
iname
parowanie chcesz zachować.źródło