Select * über mehrere Tabellen aus verschiedenen Datenbanken

Forum für neue Firebird-Anwender.

Moderator: thorben.braun

Antworten
Woolfi
Beiträge: 7
Registriert: Fr 4. Mai 2018, 10:52

Hallo zusammen

bin am basteln für uns an einem Lagerplatzinfoblatt.

das Interessante daran ist dass der Hersteller 2 Datenbanken pflegt. Eine für den Druck und andere für Daten.

Sprich eine DB heißt DBDaten und andere heißt DBDruck

was will ich machen. Eigentlich einfache Abfrage hätte gereicht

select * from ALA join ART on ALA.ID=ART.ART_ID

Leider kann ich die Abfrage nur ein eine DB richten.

Entweder an DBDaten oder DBDruck

Sprich dachte könnte so gehen:

Select * from DBDaten.ART join DBDruck.ALA on DBDruck.ALA.ID = DBDaten.ART.ART_ID order by DBDaten.ART.ARTIKELNR

Leider ohne erfolg, immer eine DB unbekannt.

Kann mir geholfen werden?
Benutzeravatar
martin.koeditz
Beiträge: 474
Registriert: Sa 31. Mär 2018, 14:35

Hallo Woolfi,

du verbindest dich üblicherweise mit einer Firebird-Datenbank. Innerhalb dieser ist die andere DB nicht bekannt. Beides sind zunächst abgeschlossene Systeme. Dies ist mit dem Schema-Konstrukt in MySQL etwas anders.

Jedoch existiert die Möglichkeit, mit einer fremden Firebird-DB zu kommunizieren - über das Konstrukt ON EXTERNAL DATA SOURCE.
Details unter https://www.firebirdsql.org/file/docume ... xecstmt-de

Über einen Execute-Block oder eine Prozedur lässt sich Daten relativ komfortabel holen.

Gruß
Martin
Martin Köditz
it & synergy GmbH
mclemens
Beiträge: 6
Registriert: Mo 16. Apr 2018, 11:05

Ich habe dieses Problem bei einem Kunden mit 2 Prozeduren gelöst.

Hier mal eine Beispiel.


select * from C_TEST1(:item_id)



SET TERM ^ ;

create or alter procedure C_TEST (
ITEM_ID integer)
returns (
ITEM_NAME varchar(80),
ITEM_NO varchar(80))
as
declare variable LISTEN_ID integer;
declare variable LISTEN_TYPE_ID integer;
declare variable LISTEN_TEXT varchar(80);
declare variable ACTION_DATE date;
declare variable LINK_ID integer;
declare variable LINK_ID1 integer;
declare variable LINK_ID2 integer;
declare variable LINK_ID3 integer;
declare variable USR_MODIFIED_BY integer;
declare variable USR_MODIFIED_DATE date;
declare variable USR_CREATED_BY integer;
declare variable USR_CREATED_DATE date;
declare variable INFOTEXT blob sub_type 0 segment size 80;
declare variable REPLICA_ID integer;
declare variable REPLICA_ACTIV varchar(1);
declare variable REPLICA_HOST varchar(20);
declare variable REPLICA_DB_PATH varchar(40);
declare variable REPLICA_USERNAME varchar(10);
declare variable REPLICA_PASSWORD varchar(10);
declare variable CONNECTIONSTRING varchar(80);
begin
replica_username='sysdba';
REPLICA_PASSWORD='abc';
CONNECTIONSTRING = 'localhost/3050:G:\DB\xyz.FDB';

EXECUTE STATEMENT 'SELECT name FROM sar100 where ITEM_id ='||item_id
on external DATA SOURCE CONNECTIONSTRING
as user REPLICA_USERNAME password REPLICA_PASSWORD
INTO :item_name;

suspend;


end^

SET TERM ; ^

SET TERM ^ ;

create or alter procedure C_TEST1 (
ITEM_ID integer)
returns (
ITEM_NAME varchar(80),
ITEM_NAME2 varchar(80))
as
begin
select name from sar100 where item_id=:item_id into :ITEM_NAME;
select item_name from c_test(:item_id) into :ITEM_NAME2;
/* Procedure Text */
suspend;
end^

SET TERM ; ^
colaflasche
Beiträge: 16
Registriert: Fr 6. Mär 2020, 16:32

Hallo Woolfi,

gehe ich recht in der Annahme, dass Du das im Fastreport-Designer machen willst?
Das ist in diesem Falle eigentlich dann keine Aufgabe, die in SQL zu lösen ist.

Du machst eine Abfrage die wie folgt lautet:
select * from ala order by Artikelnr und bindest die an die DBDruck.

Dann machst Du eine zweite Abfrage, die wie folgt lautet:
select * from art where art.id = :art_id

Im Abfrageeditor der zweiten Abfrage klickst du dann auf "Abfrage-Parameter bearbeiten" und bei "Wert" von "war_id" klickst du dann auf das Formel-Symbol und wählst aus der ersten Abfrage das Feld "Art_id" aus und kllickst auf ok.

Diese zweite Abfrage bindest Du über die Eigenschaft Master an die erste Abfrage. wichtig: Masterfields NICHT verknüpfen.

Nun kannst Du auf beide Tabellen zugreifen.

Viel Erfolg!
Antworten