Domanda su DUPLICATE KEY UPDATE
-
16-10-2019 - |
Domanda
sto cercando di confrontare i dati di due sistemi. L'idea di base è:
- Crea Temp tabella.
- Inserisci Table1 dati.
- Inserisci dati Table2 (Tabella una collegata, del server remoto) con ID univoci rispettato.
- Filtro in cui prima o la seconda tabella ha informazioni diverse.
Sto cercando di ottenere la seconda serie di inserti, dal secondo sistema, di inserire, e se duplicato, aggiornamento, invece. Io non riesco a farlo bene. Per l'inserto finale, che cosa devo avere?
Non avere il "Filtro parte", perché non ho i dati inseriti Table2. La parte del filtro mostrerebbe le righe in cui il nome di Active, ultimo o il primo è diverso tra i due sistemi. Tipo semplice where Table1LastName <> Table2LastName
dichiarazioni.
Nota: Ho questo lavoro con 2 tabelle temporanee create ... e un full outer join e qualche "Dove ID è nullo". Sto solo cercando di ottenere questo al lavoro in un modo che non ho usato prima.
if object_id('tempdb..#CompareDrs') is not null
drop table #CompareDrs;
GO
create table #CompareDrs
(
ID varchar(20) unique
,TABLE1Active varchar(1)
,TABLE1LastName varchar(50)
,TABLE1FirstName varchar(50)
,TABLE2Active varchar(1)
,TABLE2LastName varchar(50)
,TABLE2FirstName varchar(50)
);
GO
INSERT INTO #CompareDrs (ID, TABLE1Active, TABLE1LastName, TABLE1FirstName)
SELECT
right('00000000000000000000' + ForeignID, 20) ID
,case when Active = 0 then 'I'
when Active = 1 then 'A'
else ' '
end TABLE1Active
,LastName TABLE1LastName
,FirstName TABLE1FirstName
FROM
[DATABASE1].dbo.DRs
Order By
ID;
GO
INSERT Into #CompareDrs (ID, TABLE2Active, TABLE2LastName, TABLE2FirstName)
SELECT
right('00000000000000000000' + Cast(DRDR# as Varchar(50)), 20) ID
,DRAFLG TABLE2Active
,DRLNAM TABLE2LastName
,DR1NAM TABLE2FirstName
FROM
[LINKEDERVER].[DATABASE].[CATALOG].[TABLE] DR
ON DUPLICATE KEY UPDATE TABLE2Active = VALUES(TABLE2Active),
TABLE2LastName = VALUES(TABLE2LastName),
TABLE2FirstName = VALUES(TABLE2FirstName),
GO
SELECT * FROM #CompareDrs;
Soluzione
Se si utilizza SQL 2008, un'occhiata alla MERGE affermazione, si può fare ciò che altre piattaforme chiamano UPSERT, UPDATE se esiste, altrimenti INSERT.
Altri suggerimenti
Si potrebbe scrivere una dichiarazione SELECT che cattura i di id che sono stati inseriti dal primo inserimento nella tabella temporanea.
Poi è sufficiente inserire dal 2 ° tavolo a meno di id containted nell'istruzione SELET precedente. Utilizzare un ELSE per attuare le altre righe come un aggiornamento
Sembra che si sta mettendo righe corrispondenti da due tabelle in una singola riga in un'altra tabella.
Se questo è il caso, allora avete bisogno di
- Inserisci colonne della prima tabella, e
- UPDATE altre colonne della seconda tabella in cui i numeri di identificazione corrispondono e dove le altre colonne sono NULL.
potrei sbagliarmi su questo, perché non è del tutto chiaro per me che i numeri di identificazione sui due tavoli stanno per abbinare.