Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi PostgreSQL - Abfrage aus 2 Tabellen (https://www.delphipraxis.net/119487-postgresql-abfrage-aus-2-tabellen.html)

NetSonic 27. Aug 2008 11:08

Datenbank: PostgreSQL • Version: 8.3.3 • Zugriff über: ADO

PostgreSQL - Abfrage aus 2 Tabellen
 
Hallo zusammen...

Leider habe ich gerade eine Denkblockade und brauche vielleicht nur einen kleinen Lösungsansatz:

Ich habe eine PostgreSQL Datenbank mit den Tabellen "tbladress" und "tbladress_groups".

tbladress enthält die Felder: AdressNo, GroupID, Name1, Name2, Name3;
tbladress_groups enthält die Felder: GroupID, GroupName;

Das Feld GroupID enthält jeweils die eindeutige ID einer Gruppe.

Wenn ich jetzt eine SQL-Abfrage ("Select * from tbladress;") mache, dann möchte ich nicht die ID der Gruppe, sondern den Namen der Gruppe aus der der Tabelle "tbladress_groups" angezeigt haben. Wie bekomme ich das hin?

mirage228 27. Aug 2008 11:18

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Ungetestet:
Code:
SELECT
  ta.*, tbg.GroupName
FROM
  tbladress ta, tbladress_groups tbg
WHERE
  ta.GroupID = tbg.GroupID
Überall wo ein Gruppenname zu der ID existiert, werden nun auch die Datensätze dazu selektiert.

Möchtest Du auch Datensätze ohne zugehörigen Eintrag in der Gruppen-Tabelle, musst Du einen expliziten JOIN benutzen :)

NetSonic 27. Aug 2008 11:28

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Naja, es ist so dass die Datensätze in der "tbladress" nicht alle einer Gruppe zugeordnet sind. Ich möchte aber natürlich alle Datensätze eingezeigt bekommen und da, wo eine "GroupID" zugeordnet ist, soll der "GroupName" stehen, bei den anderen fehlt diese Info dann und die Spalte bleibt leer. Dein Beispiel gibt mir die Datensätze aus, allerding mehrfach und ordnet den Zeilen, in denen keine "GroupID" vorhanden ist trotzdem einen "GroupName" zu. Wie muss ich das mit JOIN angehen?

Angel4585 27. Aug 2008 11:30

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
versuchs mal mit nem Left outer join ;)

quatsch.. äh en inner join wars glaub ich

NetSonic 27. Aug 2008 11:40

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Mein Ansatz sieht jetzt so aus, allerdings bekomme ich so keine Datensätze zurück... *grübel*

SQL-Code:
SELECT      
tbladress.*,
tbladress_groups.*
FROM tbladress
INNER JOIN tbladress_groups ON tbladress."GroupID" = tbladress_groups."GroupID";

mirage228 27. Aug 2008 11:42

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Nimm mal LEFT OUTER JOIN ;-)

NetSonic 27. Aug 2008 11:53

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Dann zeigt er mir zwar wieder alle Datensätze korrekt an, aber die Spalte "GroupName" bleibt leer, egal ob eine "GroupID" vorhanden ist oder nicht...

SQL-Code:
SELECT      
tbladress.*,
tbladress_groups.*
FROM tbladress
LEFT OUTER JOIN tbladress_groups ON tbladress."GroupID" = tbladress_groups."GroupID";
Muss ich hier noch was umbauen oder wo liegt mein Fehler?

Trigger2003 27. Aug 2008 13:05

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Zitat:

Zitat von NetSonic
Dann zeigt er mir zwar wieder alle Datensätze korrekt an, aber die Spalte "GroupName" bleibt leer, egal ob eine "GroupID" vorhanden ist oder nicht...

Muss ich hier noch was umbauen oder wo liegt mein Fehler?

Kann IMHO nur bedeuten, daß in Deiner tbladress.GroupID zum Abfragezeitpunkt kein einziger gültiger Bezug auf tbladress_groups enthalten ist. Vielleicht die Testdaten nochmal kurz checken :wink: . Daher vermutlich auch kein Resultat mit INNER JOIN, das nur Datensätze zurückliefert, die erfolgreich ge-JOINed werden konnten.

PS: Statt "LEFT OUTER JOIN" kann man normalerweise auch nur "LEFT JOIN" schreiben. Das "OUTER" versteht sich an dieser Stelle von selbst. Auch statt "INNER JOIN" tut's meist schlicht "JOIN". Man ist ja schreibfaul... :stupid:

DeddyH 27. Aug 2008 13:06

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Wozu eigentlich die Gänsefüßchen in der Abfrage?

NetSonic 27. Aug 2008 13:15

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Zitat:

Zitat von Trigger2003
Kann IMHO nur bedeuten, daß in Deiner tbladress.GroupID zum Abfragezeitpunkt kein einziger gültiger Bezug auf tbladress_groups enthalten ist. Vielleicht die Testdaten nochmal kurz checken :wink: . Daher vermutlich auch kein Resultat mit INNER JOIN, das nur Datensätze zurückliefert, die erfolgreich ge-JOINed werden konnten.

Die Testdaten sind in Ordnung. Bei einem normalen Select zeigt er mir ja auch die "GroupID" an. Daran kann es nicht liegen :gruebel:

Zitat:

Zitat von DeddyH
Wozu eigentlich die Gänsefüßchen in der Abfrage?

Postgre möchte das gerne so... ;-)

Trigger2003 27. Aug 2008 13:25

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Zitat:

Zitat von NetSonic
Die Testdaten sind in Ordnung. Bei einem normalen Select zeigt er mir ja auch die "GroupID" an. Daran kann es nicht liegen :gruebel:

Sorry, will ja nicht klugsch..., aber das reine Vorhandensein der Spalte GroupID ist kein Argument. Entscheidend ist, daß zu den Werten in tbladress.GroupID auch entprechende Einträge in tbladress_group.GroupID vorhanden sind. Oder meintest Du das?

NetSonic 27. Aug 2008 13:31

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Zitat:

Zitat von Trigger2003
Sorry, will ja nicht klugsch..., aber das reine Vorhandensein der Spalte GroupID ist kein Argument. Entscheidend ist, daß zu den Werten in tbladress.GroupID auch entprechende Einträge in tbladress_group.GroupID vorhanden sind. Oder meintest Du das?

Die Tabellen enthalten die folgenden Werte:

tbladress
--------------------------
AdressNo + GroupID + Name1
--------------------------
1000 + 1 + TestA
1001 + 1 + TestB
1005 + 2 + TestC
1009 + 1 + TestD

tbladress_groups
-------------------
GroupID + GroupName
-------------------
1 + Autoren
2 + Admins

Meiner Ansicht nach, sind also alle Werte vorhanden. Nur das Select-Statement hat einen Fehler... den ich nicht finde! :wall:

Trigger2003 27. Aug 2008 13:33

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Nur 'ne Idee:

Da GroupID in beiden Tabellen enthalten ist, würde ich's mal aus Gründen der Eindeutigkeit mit Alias versuchen, wie mirage das schon angeregt hat:

SQL-Code:
SELECT      
ta.*,
tag.GroupName
FROM tbladress ta
LEFT OUTER JOIN tbladress_groups tag ON tag."GroupID" = ta."GroupID"

DeddyH 27. Aug 2008 13:34

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Mal von vorn:
SQL-Code:
SELECT A.AdressNo, A.Name1, G.Groupname
FROM tbladress A
LEFT JOIN tbladress_groups G ON G.GroupdID = A.GroupID
[edit] :oops: Zu langsam [/edit]

NetSonic 27. Aug 2008 13:46

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
SQL-Code:
SELECT A."AdressNo", A."Name1", G."GroupName"
FROM tbladress A
LEFT JOIN tbladress_groups G ON 'G."GroupID"' = A."GroupID"
Führt zu folgendem Ergebnis:

AdressNo + Name1 + GroupName
----------------------------
1001 + TestA +
1002 + TestB +
1005 + TestC +
1009 + TestD +

Das Feld "GroupName" ist LEER! :|

mirage228 27. Aug 2008 13:49

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Sicher, dass da Gänsefüßchen hinmüssen? In meinem Buch über PostgreSQL sind keine aufgeführt. Und die Join-Bedingung ist auch geklammert, aber ansonsten genauso wie hier dargestellt...

Trigger2003 27. Aug 2008 13:51

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Zitat:

Zitat von NetSonic
SQL-Code:
SELECT A."AdressNo", A."Name1", G."GroupName"
FROM tbladress A
LEFT JOIN tbladress_groups G ON 'G."GroupID"' = A."GroupID"

Ähm, woher kommen die single quotes um G."GroupID"? :gruebel:

DeddyH 27. Aug 2008 13:51

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Ich habe keine Ahnung von PostgreSQL, aber in Firebird wird der Feldname bei der Verwendung von Gänsefüßchen case-sensitive ausgewertet. Vielleicht liegt hier der Fehler?

NetSonic 27. Aug 2008 14:02

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Ooooooooops... Ich habe den Fehler gefunden! :pale:
Das Feld "GroupID" in der Tabelle "tbladress" war vom Typ "character" während in der Tabelle "tbladress_groups" das Feld "GroupID" vom Typ "integer" ist. Das kann ja auch nicht wirklich gehen. Manchmal ist man echt auf beiden Augen doof... :mrgreen:

Zitat:

Zitat von Trigger2003
Ähm, woher kommen die single quotes um G."GroupID"? :gruebel:

Postgre meckert sonst, dass er den Feldnamen nicht kennt! Deswegen die "" um den Feldnamen.
Danke für Eure Mühe und Geduld!

:dp:

Trigger2003 27. Aug 2008 14:05

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Zitat:

Zitat von DeddyH
Ich habe keine Ahnung von PostgreSQL, aber in Firebird wird der Feldname bei der Verwendung von Gänsefüßchen case-sensitive ausgewertet. Vielleicht liegt hier der Fehler?

Habe auch keine Ahnung von PostgreSQL, deshalb hier geklaut aus:
PostgreSQL SQL Syntax


Here are a few examples of both valid and invalid names:
  • my_table -- valid
    my_2nd_table -- valid
    échéanciers -- valid: accented and non-Latin letters are allowed
    "2nd_table" -- valid: quoted identifier
    "create table" -- valid: quoted identifier
    "1040Forms" -- valid: quoted identifier
    2nd_table -- invalid: does not start with a letter or an underscore

Double quotes um Feldnamen scheinen also erlaubt zu sein.

Trigger2003 27. Aug 2008 14:13

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Zitat:

Zitat von NetSonic
Manchmal ist man echt auf beiden Augen doof... :mrgreen:

:zwinker: Un ich sach noch:

Zitat:

Zitat von Trigger2003
Vielleicht die Testdaten nochmal kurz checken :wink:

Viel Erfolg noch! :coder:

NetSonic 27. Aug 2008 14:20

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Zitat:

Zitat von Trigger2003
Zitat:

Zitat von NetSonic
Manchmal ist man echt auf beiden Augen doof... :mrgreen:

:zwinker: Un ich sach noch:

Zitat:

Zitat von Trigger2003
Vielleicht die Testdaten nochmal kurz checken :wink:

Viel Erfolg noch! :coder:

Naja, die Testdaten waren ja richtig... *hust* Nur die Definition der Tabellenfelder nicht... :tongue:

Danke!

NetSonic 27. Aug 2008 15:28

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Jetzt stellt sich mir noch eine Frage:
Es ist gewünscht diese Datenmenge direkt editieren zu können. Wie stelle ich es an, da die TADOQuery ein JOIN Statement in einem Select leider blockiert und keine Modifikation zulässt, die Ergebnismenge bearbeiten zu können. Ein Select ohne JOIN Funktioniert ohne Probleme...

marabu 27. Aug 2008 15:55

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Hallo,

damit du tblAddress bearbeiten kannst, schmeißt du den Join wieder weg und arbeitest mit einem LookupField.

Grüße vom marabu

NetSonic 27. Aug 2008 16:04

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Ja gut, das würde gehen. Aber wie weiß ich denn, welcher Datensatz in der Grid (Ansicht der Datensätze aus dem SELECT/JOIN-Konstrukt) ausgewählt wurde, damit ich diesen direkt bearbeiten kann?!?! :gruebel:

marabu 27. Aug 2008 16:06

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Der im Grid ausgewählte Datensatz wird zum aktuellen Datensatz des dem Grid unterliegenden DataSet ...

NetSonic 27. Aug 2008 16:13

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Ähm, ich nutze derzeit kein DataSet. Das alles läuft über TADOConnection, TADODataSource und TADOQuery. Oder ist das ein Problem bzw. grob fahrlässig? :?:

marabu 27. Aug 2008 16:39

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
Wenn du eine datensensitive visuelle Komponente verwendest, dann benutzt du auch TDataSource - und dort musst du deinen DataSet angeben, was du ja bestimmt gemacht hast. TADOQuery ist eine von TDataSet abgeleitete Komponente, sonst könntest du deine Query dort gar nicht eintragen.
Eventuell möchtest du dir die Komponente TADODataSet anschauen, die moderner als TADOQuery ist.
TADOQuery ist mehr für BDE Konvertiten.

NetSonic 27. Aug 2008 16:41

Re: PostgreSQL - Abfrage aus 2 Tabellen
 
OK, das werde ich dann mal in Angriff nehmen. Falls es dort Probleme gibt, werd ich mich wieder melden!
Danke für den Tipp! :thumb:

Schönen Abend noch...


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:06 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