Wyciągnięcie danych z jednej bazy i złączenie ich z danymi z drugiej bazy

0

Cześć mam takie zadanie, że muszę wziąć zjoinowane 2 tabele z jednej bazy danych i jakoś zjoinować je z jedną tabelą (jedną z tych z pierwszej bazy danych) w drugie bazie danych.
Najprościej pokazać to na przykładzie.
Zapytanie z pierwszej bazy wygląda tak:

select L.REKA_NR, P.*
from KD_REJ_KADRY L
join PL_REJ_ETATY P on L.REKA_ID = P.ETAT_IDKADR;

A taki wyglądają jego wyniki:
screenshot-20210520223246.png

Zapytanie z drugiej bazy wygląda tak:

select distinct REKA_NR, MAKSIMUM as ETAT_IDKADR
from (select K.REKA_NR, K.REKA_ID, count(K.REKA_ID) OVER(PARTITION by K.REKA_NR) as ILOSC,
             max(K.REKA_ID) OVER(PARTITION by K.REKA_NR) as MAKSIMUM
      from KD_REJ_KADRY K);

A oto jego wyniki:

screenshot-20210520223534.png

Jak widać w zapytaniu pierwszym jedna z tabel (tzn. KD_REJ_KADRY) jest wykorzystywana w zapytaniu drugim.

Łącznikiem tych tabel ma być ta kolumna REKA_NR.

Chodzi mi technicznie o takie zagadnienie, czy można się odwołać do dwóch różnych baz danych i jeśli tak, to czy można jakoś zjoinować te wyniki.

Tylko dopowiem, że takie złączenie jest mi potrzebne do zasilenia tej drugiej bazy danych wybranymi kolumnami z tego złączonego zapytania.

Z góry dziękuję za wszelkie sugestie.

3

Obawiam się, że na firebird się nie da ... :( a przynajmniej nie słyszałem aby się dało). W takich bazach jak oracle, mssql czy postgresql można robić złączenia do innych baz (w oracle i postgres się to nazywa dblink) i wtedy robisz sobie (na przykładzie oracle)

select t1.id, t2.nazwa from schemat.tabela t1 join schemat.tabela2@nazwa_dblinka t2 on t2.id_remote = t1.id

niestety firebird jest bazą stricte plikową i on chyba nie ma takiej funkcjonalności ... pozostaje pokombinować z jakimś mechanizmem replikującym dane pomiędzy bazami :)

Poszukałem trochę za Ciebie i znalazłem taki ciekawy sposób z SO:
https://stackoverflow.com/questions/30320955/sql-query-joining-tables-from-different-fdb-databases

daj znać czy ten kod ci zadziałał:

execute block
returning (
   staffId integer,
   staffName varchar(100),
   remarks varchar(100)
   staffStatus varchar(10))
as
begin
   for SELECT staffId, staffName, remarks 
   FROM timeAtt 
   WHERE AB = 'X'
   into :staffId, :staffName, :remarks do begin

      execute statement 'select staffStatus from company where staffId = ' || staffId
      on external "your:connection:\string\and\db.fdb" as user FOO password BAR
      into :staffStatus;

      suspend;
   end
end
0
woolfik napisał(a):

daj znać czy ten kod ci zadziałał:

Bardzo dziękuję za odpowiedź i podesłanie linka do rozwiązania problemu. Jednak z dwóch proponowanych sposobów rozwiązania wybrałem ten wg mnie prostszy, czyli stworzenie tabeli tymczasowej, zainsertowanie do niej potrzebnych danych z dwóch baz, a następnie z tabeli tymczasowej zainsertowanie danych do tabeli docelowej.

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