SQL server aktualizacja tabel

0

Cześć,

Mam tabelę sprzedażową na lokalnym MS SQL server. Nazywa się "b85_dane_sprzedazy". Dane pochodzą z zewnętrznego źródła oracle połączonej jako "Linked servers" Codziennie chciałbym dopisywać do tej tabeli, nowe dane oraz uaktualniać te, które się zmieniły. Czyli tabela na serwerze zewnętrznym będzie źródłem. Tabela posiada dane z 3 ostatnich lat, ale oczywiście dane, które potencjalne mogą się zmienić będą pochodziły maksymalnie -10 dni. Zapytanie przekazujące, do ściągnięcia danych z ostatnich 3 lat wygląda jak poniżej

SET DATEFIRST 1

SELECT 
LV_C_8MTI,
CAST(EV_DATE_EDC_MTI AS DATE) EV_DATE_EDC_MTI,
cast(LV_QTE_DEMANDEE as numeric (15,0)) LV_QTE_DEMANDEE,
cast(LV_QTE_MANQUANTE as numeric (15,0)) LV_QTE_MANQUANTE,
cast(LV_QTE_SERVIE as numeric (15,0)) LV_QTE_SERVIE,
cast(EI_C_EAN as varchar(13)) EI_C_EAN,
left(EV_DATE_EDC_MTI,4) rok,
RIGHT(STUFF(DATEPART(week,EV_DATE_EDC_MTI),1,0,'0'),2) tydzien,
concat(LV_C_8MTI,' ',(left(EV_DATE_EDC_MTI,4))) as id_8MTI,
concat(EI_C_EAN,' ',(left(EV_DATE_EDC_MTI,4))) as id_EAN

INTO b85_dane_sprzedazy

FROM OPENQUERY(REPLIKA, 'SELECT 
G2354DOGI.HIST_L_VENTES.LV_C_8MTI,
G2354DOGI.HIST_E_VENTES.EV_DATE_EDC_MTI,
sum(LV_QTE_DEMANDEE) as LV_QTE_DEMANDEE,
sum(LV_QTE_MANQUANTE) as LV_QTE_MANQUANTE,
sum(LV_QTE_SERVIE) as LV_QTE_SERVIE,
G2354DOGI.EAN13_8MTI.EI_C_EAN,
G2354DOGI.EAN13_8MTI.EI_C_8MTI,
G2354DOGI.EAN13_8MTI.EI_ORDRE

FROM G2354DOGI.EAN13_8MTI INNER JOIN (G2354DOGI.HIST_E_VENTES INNER JOIN G2354DOGI.HIST_L_VENTES ON (G2354DOGI.HIST_E_VENTES.EV_NO_BL = G2354DOGI.HIST_L_VENTES.LV_NO_BL) AND (G2354DOGI.HIST_E_VENTES.EV_NO_EDC_PDV = G2354DOGI.HIST_L_VENTES.LV_NO_EDC_PDV) AND (G2354DOGI.HIST_E_VENTES.EV_NO_EDC_MTI = G2354DOGI.HIST_L_VENTES.LV_NO_EDC_MTI)) ON G2354DOGI.EAN13_8MTI.EI_C_8MTI = G2354DOGI.HIST_L_VENTES.LV_C_8MTI

WHERE EV_DATE_EDC_MTI > to_date(''2019-01-01'',''yyyy-mm-dd'') AND EV_C_CLI > 02000 AND EI_ORDRE = 1

GROUP BY LV_C_8MTI, EV_DATE_EDC_MTI, EAN13_8MTI.EI_C_EAN, EAN13_8MTI.EI_C_8MTI, EAN13_8MTI.EI_ORDRE')

CREATE INDEX indx_8MTI_and_data_b95 ON [listing].[dbo].[b95_dane_sprzedazy](LV_C_8MTI, EV_DATE_EDC_MTI, EI_C_EAN, id_8MTI, id_EAN)

Moje pytanie brzmi, jak powinien wyglądać kod, który uaktualni moją lokalną tabelę, o dane które się zmieniły i nowe które jeszcze się nie znajdują w lokalnej tabeli.

Pozdrawiam

0

Najpierw potrzebujesz stwierdzić co jest potrzebne - inser czy update - czyli na podstawie jakichś kluczy stwierdzasz, że taki wpis istnieje i robisz update, jak nie istnieje to robisz insert. na postawie tego, co napisałeś to tyle można poradzić.

0

jeżeli jest LV_C_8MTI i EV_DATE_EDC_MTI, a zmienia się LV_QTE_DEMANDEE lub LV_QTE_MANQUANTE lub LV_QTE_SERVIE, to aktualizujemy linie, jeżeli nie ma LV_C_8MTI i EV_DATE_EDC_MTI, to dodajemy cały rekord.

1
S4t napisał(a):

Najpierw potrzebujesz stwierdzić co jest potrzebne - inser czy update

Czytam https://stackoverflow.com/questions/108403/solutions-for-insert-or-update-on-sql-server i tam jest że MSSQL ma zarówno merge jak i upsert (tylko chyba ci z M$ nie lubia upserta) (aa że upsert to tylko pattern, a nie polecenie)

0
KamilAdam napisał(a):
S4t napisał(a):

Najpierw potrzebujesz stwierdzić co jest potrzebne - inser czy update

Czytam https://stackoverflow.com/questions/108403/solutions-for-insert-or-update-on-sql-server i tam jest że MSSQL ma zarówno merge jak i upsert (tylko chyba ci z M$ nie lubia upserta) (aa że upsert to tylko pattern, a nie polecenie)

Jakoś nigdy nie używałem merga ale jak działa to czemu nie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1