Alle Information zu einer ID bzw. einem Nachnamen ausgeben lassen ?

Forum für neue Firebird-Anwender.

Moderator: thorben.braun

Antworten
nakhan
Beiträge: 2
Registriert: So 31. Mai 2020, 11:41

Hallo in der Runde,

ich bin neu und wollte erst wissen, mit welchem Befehl ich aus einer Datenbank mit vielen Tabellen "alle" Info zu einer ID bzw. eines Nachnamens ausgeben lassen kann ?

Danke im voraus

lg

N.A.
bfuerchau
Beiträge: 541
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

DEN Befehl dazu gibt es nicht.
Du musst schon wissen, in welcher Tabelle die ID verwendet wird und für jede Tabelle den entsprechenden Select absetzen.
Du kannst natürlich auch einen Join verwenden:

select *
from MainTable a
left join SubTable1 b on a.ID = b.ID
left join SubTable2 c on a.ID = c.ID
:
:
left join SubTable25 z on a.ID = z.ID
nakhan
Beiträge: 2
Registriert: So 31. Mai 2020, 11:41

Danke für die schnelle Antwort,

wie kann ich herausfinden, in welchen Tabellen die "ID" bereits existiert bzw. verwendet wird ? dann kann ich vielleicht durch select einzeln abrufen ?
Gerd
Beiträge: 242
Registriert: Di 1. Okt 2019, 17:13

Hallo in die Runde.
nakhan hat geschrieben: So 31. Mai 2020, 13:52 ... wie kann ich herausfinden, in welchen Tabellen die "ID" bereits existiert bzw. verwendet wird ? dann kann ich vielleicht durch select einzeln abrufen ?
Mir fallen dazu diese Möglichkeiten bzw. Vorgehensweisen ein:

1. ER-Diagramm (Entity-Relationship-Diagramm)
2. Firebird ISQL Tool

zu 1. Im Folgenden ein solches ER-Diagramm zur Firebird Datenbank verein.fdb:
ID.png
ID.png (6.45 KiB) 33003 mal betrachtet
zu 2. Firebird ISQL Tool am Beispiel der Firebird Datenbank (Alias) verein.fdb:

Mit isql -a verein.fdb holst Du Dir den Aufbau. So:

Code: Alles auswählen

gerd@gerd-MS-7641:~$ isql -a verein.fdb

SET SQL DIALECT 3; 

/* CREATE DATABASE 'verein.fdb' PAGE_SIZE 8192 DEFAULT CHARACTER SET UTF8; */


COMMIT WORK;

/* Table: KOMMUNIKATION, Owner: GERD */
CREATE TABLE KOMMUNIKATION (ID INTEGER NOT NULL,
        MITGLIED_NR INTEGER NOT NULL,
        TELEFON VARCHAR(15),
PRIMARY KEY (ID));

/* Table: MITGLIEDER, Owner: GERD */
CREATE TABLE MITGLIEDER (ID INTEGER NOT NULL,
        VORNAME VARCHAR(15),
        NAME VARCHAR(20),
PRIMARY KEY (ID));

ALTER TABLE KOMMUNIKATION ADD CONSTRAINT FK_KOMM FOREIGN KEY (MITGLIED_NR) REFERENCES MITGLIEDER (ID) ON UPDATE CASCADE ON DELETE CASCADE;

/* View: V_TELEFONLISTE, Owner: GERD */
CREATE VIEW V_TELEFONLISTE (ID, VORNAME, NAME, TELEFON) AS
SELECT mitglieder.id, mitglieder.vorname, mitglieder.name, kommunikation.telefon
FROM mitglieder
JOIN kommunikation
ON mitglieder.id = kommunikation.mitglied_nr;
gerd@gerd-MS-7641:~$
Bspw. erkennst Du an den CREATE TABLE Statements schon einmal die Tabellen - hier Kommunikation und Mitglieder.
Beim ALTER TABLE Statement bedarf der Fremdschlüssel (FOREIGN KEY) Deine Aufmerksamkeit. Hier ist es der einzigste Fremdschlüssel mit der Bezeichnung MITGLIED_NR.

Hast Du den Tabellenüberblick und ggfls. die Fremdschlüsselbezeichnungen zusammen, dann fragst Du, wie im Beispiel gezeigt, die infrage kommenden Tabellen mittels SELECT ... WHERE ab. Du kannst auch SELECT-Abfrage mittels JOIN verwenden. Siehe dazu: CREATE VIEW V_TELEFONLISTE und siehe auch die Antwort von bfuerchau.

Code: Alles auswählen

gerd@gerd-MS-7641:~$ isql verein.fdb
Database: verein.fdb, User: GERD
SQL> SELECT * FROM kommunikation WHERE mitglied_nr = 1;

          ID  MITGLIED_NR TELEFON         
============ ============ =============== 
           1            1 1234888888      
           5            1 01769999999     

SQL> SELECT * FROM mitglieder WHERE id = 1;

          ID VORNAME         NAME                 
============ =============== ==================== 
           1 Arno            Müller               

SQL>

Viele Grüße
Gerd
ISQL Version: LI-V5.0.1.1469
Linux Mint 22 Cinnamon 6.2.7
bfuerchau
Beiträge: 541
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

Da kommst du um ein graphisches Tool zur Anzeige nicht drum herum.
Allein der Begriff "ID" sagt ja nichts über den Inhalt, da die ID ja Artikel, Bestellungen, Kunden oder sonstwas enthält.
Und es ist schon mühsam, für jede Tabelle den Select zu tippen.

Je nach Umgebung beitet sich z.B. Squirrel an. Das ist Eclipse-basiert (Java) und funktioniert halt auch auf Linux. Der JDBC-Treiber ist da nötig.
Für Windows gibt es z.B. auch den IBExpert.
Ich hatte mir vor 15 Jahren die kostenlose PE-Version geholt, die heute (auch mit 3.0) immer noch funktioniert. Nicht perfekt, aber für mich reichts allemal.
Aktuell ist sie mir leider zu teuer.

Wenn du Office hast, kann man sich die Daten auch via Excel->Externe Daten->ODBC-Quelle (mit dem Firebird-ODBC-Treiber) ansehen. Sich in Tabellen laden und per Korrelation (SVERWEIS) Beziehungen entdecken.

Es gibt bestimmt noch mehr. Aber um die Datenanalyse, ggf. mit Vergleich zur Anwendung, kommst du nicht herum.
Benutzeravatar
martin.koeditz
Beiträge: 474
Registriert: Sa 31. Mär 2018, 14:35

Hallo Nakhan,

wenn es um den Inhalt der Spalten geht, hilft eigentlich nur ein grafisches Frontend, wie bereits erwähnt. Möchtest du jedoch auf struktureller Ebene Informationen sammeln, kannst du auf die Systemtabellen zurückgreifen. Hierüber kannst du jede DDL-Information der Datenbank auslesen.

Folgende Tabellen sind hier besonders aufschlussreich:
RDB$FIELDS https://firebirdsql.org/file/documentat ... ds-de.html
RDB$RELATIONS https://firebirdsql.org/file/documentat ... ns-de.html

Gruß
Martin
Martin Köditz
it & synergy GmbH
vr2
Beiträge: 239
Registriert: Fr 13. Apr 2018, 00:13

Hallo Nakhan,

in Ergänzung zu Martins Posting: Wenn Du noch ein wenig mehr Hintergrund liefern kannst, können wir vermutlich besser Ratschläge geben. Angenommen, Du hast in Deinem Job ein Projekt mit Datenbank "geerbt", kennst aber die Datenbankstruktur nicht, dann musst Du Dir zunächst mal einen Überblick über die Struktur verschaffen, also mindestens, wie heißen die Tabellen, in denen das ist, was Du suchst. Wenn Du Anhaltspunkte wie bspw Feldnamen hast, kannst Du gezielter suchen. In Firebird fragst Du dafür die Systemtabellen ab, wie andere Tabellen auch. Weißt Du bspw nur, dass es eine oder mehrere Tabellen mit Namensfeldern gibt, die auch so benannt sind (muss nicht sein, manchmal sind Feldnamen kein Stück sprechend vergeben worden), kannst Du bspw so danach suchen:

Code: Alles auswählen

select distinct r.rdb$relation_name
from rdb$relations r
join rdb$relation_fields f on f.rdb$relation_name = r.rdb$relation_name
where f.rdb$field_name containing 'name'
and r.rdb$system_flag = 0
Das gibt dir die Liste der Namen der Tabellen, die Felder haben, wo 'name' drin vorkommt, ohne Großkleinschreibung. Du bekommst so uU mehr als Du brauchst, weil das statement nur die Systemtabellen ausklammert, die ebenfalls Felder mit 'name' in Feldnamen haben, aber keine weitere Differenzierung, Du bekommst also auch Views. Das kann man bei Bedarf weiter verfeinern.

Mit isql auf die DB loszugehen geht zwar, aber ein DB-Admintool ist fast immer besser, Du kriegst viel schneller einen Überblick und die typischen Aufgaben sind einfacher zu erledigen. Es gibt zb (Free And Open Source) Flamerobin http://www.flamerobin.org/. Damit kommst Du sehr weit.

Happy Coding, Volker
Antworten