Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL-Abfrage in 2 Tabellen (https://www.delphipraxis.net/188063-sql-abfrage-2-tabellen.html)

ekatharina 27. Jan 2016 16:38

Datenbank: firebird 2.5 • Version: 2.5 • Zugriff über: Delphi 2007

SQL-Abfrage in 2 Tabellen
 
Hi Ihr Lieben,

ich bekomme einfach keine SQL-Abfrage hin wenn es um Informationen aus zwei Tabellen geht.
Tab1-Felder: A_ID, ID_P, Herkunft ... ... ...
Tab2-Felder: A_ID, P_ID, Wann ... ... ...

Die SQL sollte mir alle Wann-Daten aus der Tab2 liefern sofern die Herkunft aus der Tab1 z.B. 'Deutschland' entspricht.

Seit Tagen alles mögliche probiert und experimentiert und nun fast am verzweifeln :roll: ....

(DB = Firebird / Delphi = 2007)

Danke für einen Hinweis.

mkinzler 27. Jan 2016 16:43

AW: SQL-Abfrage in 2 Tabellen
 
Wie sieht die Beziehung zwischen den beiden Tabellen aus?

Jumpy 27. Jan 2016 16:44

AW: SQL-Abfrage in 2 Tabellen
 
Wie hängen die Tabellen denn zuasmmen? Über A_ID oder über P_ID/ID_P?

Edit: Zwei Dumme, ein Gedanke, kein roter Kasten :)

nahpets 27. Jan 2016 17:05

AW: SQL-Abfrage in 2 Tabellen
 
Wenn die beiden Tabellen über id_p / p_id zusammenhängen:
SQL-Code:
select tab2.wann from tab1, tab2
where tab1.id_p = tab2.p_id
and tab1.Herkunft = 'Deutschland'
ansonsten über A_ID
SQL-Code:
select tab2.wann from tab1, tab2
where tab1.a_id = tab2.a_id
and tab1.Herkunft = 'Deutschland'

DeddyH 27. Jan 2016 17:24

AW: SQL-Abfrage in 2 Tabellen
 
Oder etwas "moderner" über einen INNER JOIN.
SQL-Code:
SELECT
  tab2.wann
FROM
  tab2
  INNER JOIN
    tab1 ON tab1.id_p = tab2.p_id
WHERE
  tab1.Herkunft = 'Deutschland'

ekatharina 27. Jan 2016 20:45

AW: SQL-Abfrage in 2 Tabellen
 
Hi,

Danke für die Antworten. Ich habe als erstes die "moderne" Variante ausprobiert (aber noch nicht wirklich begriffen) jedoch erhalte ich zumindest ein Ergebnis statt Fehlermeldungen.

Merkwürdig ist nur:
In der tab1.Herkunft gibt es knapp 16.000 (von ca. 22.000) Datensätzen mit "Deutschland".
In der Tab2 gibt es insgesamt nur 70.000 Datensätze überhaupt und trotzdem sagt mir der SQL:
dass er 92.699 Datensätze findet. Wo könnte mein Logik-fehler begründet sein?

nachfolgend die "Originale"-SQL

SELECT
messwerte.*
FROM
messwerte
INNER JOIN
patienten ON patienten.id_pat = messwerte.pat_id
WHERE
patienten.herkunft_kind = 'Deutschland'

mkinzler 27. Jan 2016 20:50

AW: SQL-Abfrage in 2 Tabellen
 
Besser so:
SQL-Code:
SELECT
   m.*
FROM
   patienten p
     join messwerte m ON m.pat_id = p.id_pat
WHERE
  p.herkunft_kind = 'Deutschland';
Ich würde auch statt dem Joker die Felder explizit angeben

ekatharina 27. Jan 2016 20:56

AW: SQL-Abfrage in 2 Tabellen
 
Es sieht so aus als ob ich den Fehler schon gefunden habe

SELECT
messwerte.*
FROM
messwerte
INNER JOIN
patienten ON patienten.id_pat = messwerte.pat_id and patienten.arzt_id = messwerte.arzt_id
WHERE
patienten.herkunft_kind = 'Deutschland'

Muss das nur noch an einem "seltenem" Land überprüfen. Naja da wo ich das Ergebnis noch an den Fingern nachzählen kann:-D

Der Joker war der Bequemlichkeit geschuldet. Im Ergebnis brauche ich eh nur einige Felder. Aber danke für den Hinweis.

Euch allen meinen herzlichsten Dank für Euer Wissen und die Hilfe.

haentschman 27. Jan 2016 21:45

AW: SQL-Abfrage in 2 Tabellen
 
Moin...:P
Ein kleiner Hinweis auf Normalisierung. Die Ländernamen gehören, wenn es denn möglich ist, in eine separate Tabelle und in die bestehende Tabelle die ID des Landes. :thumb:

Perlsau 3. Feb 2016 04:33

AW: SQL-Abfrage in 2 Tabellen
 
Zitat:

Zitat von ekatharina (Beitrag 1328542)
Ich habe als erstes die "moderne" Variante ausprobiert (aber noch nicht wirklich begriffen) ...


SQL-Code:
SELECT
  tab2.wann
FROM
  tab2
  INNER JOIN
    tab1 ON tab1.id_p = tab2.p_id
WHERE
  tab1.Herkunft = 'Deutschland'
Das ist eigentlich ganz einfach:
  1. der erste Eintrag nach INNER JOIN legt die Nachschlage-Tabelle fest (Lookup-Tabelle, Untertabelle)
  2. der zweite Eintrag nach ON bestimmt den PK (Primary Key), die fortlaufende und dadurch eindeutige ID
  3. der dritte Eintrag nach dem = legt den FK (Foreign Key = Fremdschlüssel) in der Haupttabelle fest, der an Stelle des eigentlichen Wertes eingetragen wird.

Dejan Vu 3. Feb 2016 06:47

AW: SQL-Abfrage in 2 Tabellen
 
Schön einfach erklärt.:thumb: Nur eine Kleinigkeit.
Zitat:

Zitat von Perlsau (Beitrag 1329168)
  1. ...
  2. der zweite Eintrag nach ON bestimmt den PK (Primary Key), die fortlaufende und dadurch eindeutige ID
  3. ...

Ein primary key muss nur eindeutig sein. Ob er fortlaufend, zufällig (GUID) oder manuell (EMail-Adresse, selbst gewählte Kürzel, Buchstaben etc.) erzeugt wurde, ist irrelevant. Natürlich ist man bestrebt, einen PK nicht unnötig groß zu wählen, aber vom Wesen des PK her ist das wurschd.

DeddyH 3. Feb 2016 07:38

AW: SQL-Abfrage in 2 Tabellen
 
Das klingt jetzt so, als könne man lediglich Schlüsselfelder verknüpfen. Vielleicht sollte man es etwas anders erklären:
- nach dem JOIN bezeichnet man die Tabelle, die verknüpft werden soll.
- nach dem ON definiert man, unter welchen Bedingungen verknüpft werden soll. Das sind zwar zumeist Schlüsselfelder wie schon angesprochen, tatsächlich ist man völlig frei in der Definition.

Perlsau 3. Feb 2016 08:19

AW: SQL-Abfrage in 2 Tabellen
 
Lieber DeddyH, lieber Dejan Vu, das habt ihr beide sehr schön ergänzt :thumb:

Allerdings halte ich es in manchen Fällen, in denen grundlegende Fragen zu einem Thema gestellt werden und damit offenbar wird, daß der Fragesteller gewiß kein Profi ist, für kontraproduktiv, eine Erklärung mit allen nur denkbaren Eventualitäten zu versehen. Bei passender Gelegenheit, wenn der Fragesteller über ausreichende Grundkenntnisse verfügt, wird er sich womöglich selber zu weitreichenderen Fragestellungen entwickeln.

Selbstverständlich weiß auch ich, daß man nicht unbedingt einen Primary Key benötigt. Die Eindeutigkeit eines Records kann auch durch andere Constraints erzwungen werden und man kann mehrere Spalten als Key verwenden. Das würde in diesem Zusammenhang aber erstmal zu weit führen, denn die Frage, die ich hier beantwortet hatte, war die nach dem Funktionieren der "modernerern Version" des SQL-Codes von DeddyH, nicht mehr und nicht weniger. Und diese Antwort ist mir offenbar gelungen. Mehr lag nicht in meiner Absicht.

Doch selbstverständlich seien euer beider unerreichbare Genialität und herausragende Fertigkeiten im Umgang mit Delphi und mit Datenbanken an dieser Stelle voll & ganz wahrgenommen & akzeptiert.

DeddyH 3. Feb 2016 08:51

AW: SQL-Abfrage in 2 Tabellen
 
Sry, aber wer etwas dagegen hat, ggf. korrigiert zu werden, sollte einfach nicht posten.

mkinzler 3. Feb 2016 09:37

AW: SQL-Abfrage in 2 Tabellen
 
Zitat:

Allerdings halte ich es in manchen Fällen, in denen grundlegende Fragen zu einem Thema gestellt werden und damit offenbar wird, daß der Fragesteller gewiß kein Profi ist, für kontraproduktiv, eine Erklärung mit allen nur denkbaren Eventualitäten zu versehen. Bei passender Gelegenheit, wenn der Fragesteller über ausreichende Grundkenntnisse verfügt, wird er sich womöglich selber zu weitreichenderen Fragestellungen entwickeln.
Anfänger müssen es also zuerst falsch Lernen, bevor man Ihnen zeigt, wie es richtig geht?

Perlsau 3. Feb 2016 10:23

AW: SQL-Abfrage in 2 Tabellen
 
Zitat:

Zitat von DeddyH (Beitrag 1329205)
Sry, aber wer etwas dagegen hat, ggf. korrigiert zu werden, sollte einfach nicht posten.

Und wie kommst du jetzt auf diesen Gedanken? Ist doch in Ordnung, wenn man korrigiert und ergänzt wird. Hab ich vielleicht irgendwo was anderes verlauten lassen? Habe ich etwa nicht geschrieben: Lieber DeddyH, lieber Dejan Vu, das habt ihr beide sehr schön ergänzt. Wieso machst du daraus jetzt eine unterentwickelte Kritikfähigkeit und wirfst mir das vor? Darf ich überhaupt auf derartige Vorwürfe eingehen, ohne mich des Vorwurfs schuldig zu machen, Off-Topic zu schreiben? Vermutlich nicht ... da kommt ja auch schon ein Moderator:

Zitat:

Zitat von mkinzler (Beitrag 1329213)
Anfänger müssen es also zuerst falsch Lernen, bevor man Ihnen zeigt, wie es richtig geht?

Auch das hat keiner behauptet. Anfänger fühlen sich aber nicht selten – und das wurde hier bereits sehr häufig bestätigt – durch zuviel Information erschlagen, weshalb ich meine Erklärung vereinfacht habe. Es ging ja vor allem erst einmal darum, daß der TE den betreffenden SQL-Code versteht. Ich kann an meinem Verhalten nichts derart Schlimmes erkennen, das "Prügel" von gleich drei Seiten rechtfertigen würde, schon gar nicht die von dir unterstellte Behauptung, ich würde hier an Anfänger Falsches weitergeben. Dennoch halte ich euch gerne die andere Wange hin, wenn's hilft. Ab und zu muß man ja auch mal Dampf ablassen dürfen, nicht wahr :lol:

Es ging mir nicht um eine vollständige und umfassende Erklärung, denn "wie es geht", hatte ja bereits DeddyH oben mit seinem SQL-Code gezeigt. Mein Anliegen bestand lediglich darin, dem Unverständnis des TE für diese Code abzuhelfen. Bin ich damit DeddyH oder dir auf die Füße getreten, tut mir das leid, das war mit Sicherheit nicht beabsichtigt (mußt du natürlich nicht glauben). Wenn ihr aber grundsätzlich nicht möchtet, daß ich mich hier auch schreibend und erklärend betätige, einfach mitteilen, wir haben hier ja keine Zwangsmitgliedschaft wie bei der GEZ und ich werd's garantiert überleben :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz