Krzysztof Sobczak

Krzysztof Sobczak informatyk, ABAKNET

Temat: Przyrostowe dodawanie danych do tabeli

Mam tabele w bazie SQL Server 2008 R2. Do tabeli A1 są co noc zaciągane dane z innego całkiem systemu i są to dane wszystkie począwszy od 2010-01-01 do dnia bieżącego. Z tej tabeli chciałbym przenosić do Tabeli A2 tylko te rekordy które w tabeli A1 są nowe a wiec sa z dnia poprzedniego z pominięciem już wcześniej zaciągniętych danych.
I moje pytanie to jak to wykonać abym za każdym razem nie zaciągał wszystkich danych z Tabeli A1 do tabeli A2.
Z góry dziękuje za wskazówki i pomoc a możne jakieś konkretne przykłady.

konto usunięte

Temat: Przyrostowe dodawanie danych do tabeli

Krzysztof S.:
Mam tabele w bazie SQL Server 2008 R2. Do tabeli A1 są co noc zaciągane dane z innego całkiem systemu i są to dane wszystkie począwszy od 2010-01-01 do dnia bieżącego. Z tej tabeli chciałbym przenosić do Tabeli A2 tylko te rekordy które w tabeli A1 są nowe a wiec sa z dnia poprzedniego z pominięciem już wcześniej zaciągniętych danych.
I moje pytanie to jak to wykonać abym za każdym razem nie zaciągał wszystkich danych z Tabeli A1 do tabeli A2.
Z góry dziękuje za wskazówki i pomoc a możne jakieś konkretne przykłady.


Myślę ze Twój przełożony udzieli Ci odpowiedzi na to pytanie
Krzysztof Sobczak

Krzysztof Sobczak informatyk, ABAKNET

Temat: Przyrostowe dodawanie danych do tabeli

po co odpowiadac jak sie nie wie co odpowiedziec.....

konto usunięte

Temat: Przyrostowe dodawanie danych do tabeli

Nie wiem czy dobrze myślę ale można by do tego podejść np. tak:

Kopiowanie:

SELECT DISTINCT kolumna1, kolumna2, … , kolumnaN INTO tabela_docelowa
FROM Tabela_bazowa
[ON Warunek_złączenia]
WHERE warunek IN zbiór_dopasowań

A jeśli chodzi o selekcje rekordów z datą nie wiem czy o dokładnie taki układ danych chodzi ale podobny temat był poruszany:
http://www.goldenline.pl/grupy/Komputery_Internet/bazy...

I trzeba połączyć te dwie rzeczy myślę że np. jakieś zapytanie zagnieżdżone w WHERE załatwiło by sprawę.

Aby zautomatyzować całość można użyć jakiegoś joba, który będzie wykonywał się co jakiś czas.
Pozdrawiam.Ten post został edytowany przez Autora dnia 10.04.14 o godzinie 22:48
Łukasz K.

Łukasz K. programista
ASP.NET/JS/T-SQL,
2KMM Sp z o.o.

Temat: Przyrostowe dodawanie danych do tabeli

MERGE
Krzysztof Sobczak

Krzysztof Sobczak informatyk, ABAKNET

Temat: Przyrostowe dodawanie danych do tabeli

hmmmm, dzieki za pomoc choc, tak zastanawiajac sie i tu moja wina ze dokladniej tego nie opisalem, zamiast moze dzialac po datach mozna by wyeliminowac po np id_dok.
Aby wyjasnic dokladniej opisze ponizej:
z systemu magazynowego wyjatkowo niekompatybilnego z sqlem do tabeli A1 w SQL Server 2008 przenoszone sa dane i zapisywane wg. struktury:
ID_dokum, Data_dokum, Numer_dokum, Wartosc_dokum, Odbiorca_dokum
W import nie mozna ingerowac bo wykonuje go skrypt od strony autora systemu magazynowego i rekordow jest okolo 60-70 tys.
tabela A1 przed nocnym ponownym zaladowaniem jest kasowana i zakladana na nowo.
Ja chcialbym z tej tabeli zaladowac wszystkie rekordy do wlasnej tabeli A2 i z tym nie mam problemu ale kazdego kolejnego dnia ( tj. nocy ) aby tylko ladowaly sie nowe rekordy te ktore poprzedniego dnia nie istnialy jeszcze w tabeli A1. ustawianie warunkow i ustawianie po datach moze byc czasochlonne przy takiej ilosci danych, poza tym tylko dwie kolumny sa nie powtarzalne przy tabeli dokumentow A1: ID_dokum i Numer_dokum, z tego Numer_dokum to wartosci tekstowe np 2014/03/01232/Wr2 co chyba jest malo praktyczne do stawiania warunkow po takiej kolumnie.
Myśle ze teraz juz dobrze opisalem sytuacje i bede wdzieczny za wsparcie.
Mariusz K.

Mariusz K. Projektant
Programista

Temat: Przyrostowe dodawanie danych do tabeli

Łukasz K.:
MERGE

Łukasz podał słowo klucz do tego problemu, poczytaj o tym.
Robert Chmielewski

Robert Chmielewski Senior SQL
Developer, Sagra
Technology sp. z
o.o.

Temat: Przyrostowe dodawanie danych do tabeli

Rozumiem że ID_DOKUM jest unikalnym polem dla rekordów i jest INTem
Załóż na to pole PRIMARY KEY na obu tabelach i sprawdź co będzie najszybsze w twoim przypadku

Rozwiązanie 1)

INSERT INT A2( .... )
SELECT A1.*
FROM A1
LEFT JOIN A2 ON A1.ID_DOKUM=A2.ID_DOKUM
WHERE A2.ID_DOKUM IS NULL

Rozwiązanie 2)

INSERT INTO A2(...)
SELECT * FROM A1
WHERE ID_DOKUM NOT IN (SELECT ID_DOKUM FROM A2)

Rozwiązanie 3)

INSERT INTO A2(...)
SELECT * FROM A1
EXCEPT
SELECT * FROM A2

Rozwiązanie 4)

INSERT INTO A2(...)
SELECT * FROM A1
WHERE ID_DUKUM IN
( SELECT ID_DUKUM FROM A1
EXCEPT
SELECT ID_DOKUM FROM A2
)

-----
Zamiast kropek oczywiście należy wstawić odpowiednie nazwy kolumnTen post został edytowany przez Autora dnia 11.04.14 o godzinie 18:50
Robert Chmielewski

Robert Chmielewski Senior SQL
Developer, Sagra
Technology sp. z
o.o.

Temat: Przyrostowe dodawanie danych do tabeli

Co do MERGE odradzam w tym przypadku
Tu mają być dopisywane tylko nowe rekordy
A MERGE będzie porównywał całe zawartości obydwu tabel,
aby dokonać aktualizacji istniejących już rekordów.Ten post został edytowany przez Autora dnia 11.04.14 o godzinie 18:49
Paweł Broda

Paweł Broda Software Engineer

Temat: Przyrostowe dodawanie danych do tabeli

Jeśli ID dokumentu jest przypisane na stałe i jest nadawane z jakiejś sekwencji, to możesz przy każdorazowym ładowaniu do tabeli docelowej odkładać sobie gdzieś na boku max(ID) ładowania. Przy kolejnym ładowaniu bierzesz z tabeli źródłowej tylko te rekordy, gdzie ID > odłożone max(ID) i aktualizujesz parametr max(ID).
Przy wykorzystaniu tej metody nie wyłapiesz potencjalnych zmian tych rekordów, które zostały załadowane wcześniej (jeśli takie zmiany są możliwe).
Robert Chmielewski

Robert Chmielewski Senior SQL
Developer, Sagra
Technology sp. z
o.o.

Temat: Przyrostowe dodawanie danych do tabeli

Paweł B.:
Jeśli ID dokumentu jest przypisane na stałe i jest nadawane z jakiejś sekwencji, to możesz przy każdorazowym ładowaniu do tabeli docelowej odkładać sobie gdzieś na boku max(ID) ładowania. Przy kolejnym ładowaniu bierzesz z tabeli źródłowej tylko te rekordy, gdzie ID > odłożone max(ID) i aktualizujesz parametr max(ID).
Przy wykorzystaniu tej metody nie wyłapiesz potencjalnych zmian tych rekordów, które zostały załadowane wcześniej (jeśli takie zmiany są możliwe).

To by było najprostrze rozwiązanie

INSERT INTO A2(...)
SELECT * FROM A1
WHERE ID_DOKUM > (SELECT MAX(ID_DOKUM) FROM A2)

ale mamy do czynienia z jakimś systemem zewnętrznym
w którym jak mogę się domyślać ID_Dokum jest zakładany w momencie utworzenia dokumentu
a eksportowany dopiero po jego zamknieciu (zatwierdzeniu).

Czyli może się zdażyć że np w poniedziałek zostaną wyeksportowane dokumenty o id 10001,10003,10004
a we wtorek dokument 10002, który zostal założony w poniedziałek ale zamknięty dopiero we wtorek.
W takim przypadku ten sposób nie zadziała.Ten post został edytowany przez Autora dnia 11.04.14 o godzinie 21:23
Krzysztof Sobczak

Krzysztof Sobczak informatyk, ABAKNET

Temat: Przyrostowe dodawanie danych do tabeli

tak, Robert, masz racje, taki przypadek moze miec miejsce!
Robert Chmielewski

Robert Chmielewski Senior SQL
Developer, Sagra
Technology sp. z
o.o.

Temat: Przyrostowe dodawanie danych do tabeli

Krzysztof S.:
tak, Robert, masz racje, taki przypadek moze miec miejsce!

To pozostają Ci 4 przykłady, które podałem wczesniej
One są pozbawione tej niedogodności
Krzysztof Sobczak

Krzysztof Sobczak informatyk, ABAKNET

Temat: Przyrostowe dodawanie danych do tabeli

Wielkie dzieki, dzieki za wsparcie juz sprawdzilem i dziala wszystko jak nalezy.
Jeszcze raz wielkie dzieki!

Następna dyskusja:

MySQL. Dodawanie danych los...




Wyślij zaproszenie do