[MS SQL] Wyciąganie danych z kilku baz


(Marcin Obala) #1

Cześć

Chciałbym wyciągnąć dane z dwóch, trzech, kilku baz jednocześnie. Ktoś sobie wymyślił że zamiast zrobić kolumnę z datą zrobił tak że co miesiąc jest tworzona nowa baza. Tego już nie zmienię. Chciałbym teraz wyciągnąć dane np. Name, Sum(CosTam). Jeśli wyciągam dane z jednej bazy to zapytanie proste. Jednak co w przypadku gdy potrzebuję Name (w obu bazach takie samo) ale przy Sum chciałbym sumę z dwóch baz dla danego name. Czy da się zrobić coś takiego zapytaniem? Dodam że sprawa nie uproszcza się do dwóch baz czy 3 jak wymieniłem wyżej tylko może to być też 24 bazy czy 36 skoro na każdy miesiąc jest inna...


(Grzelix) #2

(Marcin Obala) #3

Szukałem już ale nie umiem zrobić tego w sposób "dodaj bazę po przecinku" do zapytania. Wszędzie są przykłady gdzie dane się powtarzają w bazach. U mnie niekoniecznie. Może być tak że w jednej bazie nie będzie ani jednego odpowiadającego wiersza drugiej bazy. Aktualnie mam zrobione milion zapytań połączonych przez union i jedno główne które znowu sumuje grupując po nazwach. Jakby ktoś nie mógł zrobić tego w jednej tabeli.


(Grzelix) #4

Jeśli masz tak rozjechane schematy (nie jestem pewien czy to dobre tłumaczenie) baz danych to jest dość poważny problem.

Jednak z tego co wyczytałem to dana baza po okresie miesiąca jest bazą archiwalną. Może zrób jedną bazę główną do której będziesz zapuszczał skrypt raz w miesiącu i kopiował dane z nowo powstałej bazy do bazy danych. To powinno bardzo uprościć sytuację.

Dziwi mnie też czemu te schematy są różne skoro według twojego opisu w każdym przedziale czasu powstaje kolejna kopia bazy podstawowej.


(Marcin Obala) #5

Schemat bazy jest identyczny tylko zawartość różna. Nie wiem czy dobrze zrozumiałeś. Po prostu przykłady w internecie mówią o wyciąganiu danych gdzie łączę bazy (tabele w bazach) przez jakiegoś joina. Albo znowu nie mam zbyt dużego doświadczenia albo się nie da bo ja chcę wyświetlić dane z tabeli A I z tabeli B nawet jeśli wiersz z tabeli A nie ma odpowiednika w B i wiersz z B nie ma odpowiednika z A. Hmmm Outer join tak nie działa? Idę sprawdzić


(mordesku) #6

jeśli rozmawiamy o różnych tabelach w jednej bazie to możesz użyć zwyklego selecta z union

http://www.w3schools.com/sql/sql_union.asp


(Marcin Obala) #7

Mówimy o innych bazach z takim schematem i tymi samymi tabelami w tych bazach. A co do union to na razie zrobiłem tak:

select Name, Sum(CosTam)

from(

select Name, sum(CosTam) as CosTam from DB_A.TableA

Group by Name

UNION ALL

select Name, sum(CosTam) as CosTam from DB_B.TableA

Group by Name

UNION ALL

select Name, sum(CosTam) as CosTam from DB_C.TableA

Group by Name

UNION ALL

select Name, sum(CosTam) as CosTam from DB_D.TableA

Group by Name

)

group by Name

(mordesku) #8

tak z ciekawości zapytam z jakiego serwera sql korzystasz ?

edit ----

Na szybko w mysql sprawdzone i dziala:

SELECT * FROM morda.a

UNION

SELECT * FROM moja.a

2 bazy danych "morda" i "moja" o takiej samej strukturze zwrócił mi odpowiednie wyniki.


(Marcin Obala) #9

Tam jest chyba 2008 R2 ale darmowy. Mi chodzi o to żeby zwrócić sumę jednej z kolumn dla wszystkich baz. Hmmmm wymyślmy, np. Wypłaty. W każdej bazie są wypłaty ludzi z danego miesiąca. W jednym miesiącu dostał gościu 3000 zł, w drugim 2500 a ja chcę wyciągnąć dane dla całego roku i wiedzieć ile zarobił przez rok. Jednak dane są w 12 bazach (nie tabelach a bazach). I teraz w trakcie mógł zostać zatrudniony ktoś albo zwolniony. Nie będzie go w któryś miesiącach więc chcę sumę tylko tych miesięcy w których jest. Tak w skrócie. Czy Union połączy Np. kowalskiego z mordy i kowalskiego z moja i wyświetli sumę kolumny wypłata?


(mordesku) #10

Union działa tak że łączy selecty ze sobą jeden pod drugim. Dzięki temu można wyświetlić dane z kilku tabel w postaci jednej wirtualnej tabeli. Sam union ma kilka ograniczeń np. jesli selecty się różną strukturą itp. ale to nas nie dotyczy. Co do twojego problemu to nie bardzo znam się na strukturze i działaniu mssql, sam całkiem nieźle znam mysql i troszkę postgresa. Być może ktoś inny Ci pomoże ale polecam zmienić nazwę wątku z

na [MS SQL] :)