Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Schwieriger SQL-Befehl (https://www.delphipraxis.net/22431-schwieriger-sql-befehl.html)

frankg 17. Mai 2004 19:03


Schwieriger SQL-Befehl
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo allerseits!

Momentan brüte ich über einem SQL-Befehl, der mir nicht gelingen will. Entweder das ist wirklich so schwierig, wie es momentan für mich aussieht, oder ich steh im Wald und seh die Bäume nicht...

Also, ich habe in meiner Datenbank die folgende Konstellation: Es gibt eine Tabelle, in der Firmen verwaltet werden und eine Tabelle, in der Mitarbeiter verwaltet werden. Zwischen den beiden Tabellen besteht eine M:N-Beziehung, d.h. eine Firma kann mehrere Mitarbeiter beschäftigen und ein Mitarbeiter kann in mehreren Firmen arbeiten. Diese M:N-Beziehung ist natürlich durch eine Zwischentabelle aufgelöst (siehe angehängtes Datenbankdiagramm. So weit so einfach. Ich muss nun einen SQL-Befehl zusammenzimmern, der mir für jede Firma nur den alphabetisch ersten Mitarbeiter zusammen mit den Firmendaten zurückliefert. Der Harken bei der Sache (da ist immer ein Harken :wink: ). Ich kann nur auf SQL zurückgreifen und der Spass muss unter Access laufen. Ich habe schon den folgenden SQL-Befehl probiert, der klappt aber nicht (liefert nur den alphabetisch 1. Mitabeiter der 1. Firma zurück) - Die Tabellennamen können leicht vom Diagramm abweichen, aber im Prinzip ist es dasselbe Problem:

SQL-Code:
SELECT
   t_Unternehmen.Name,
   tFirst.Unternehmer
FROM
  t_Unternehmen INNER JOIN
     (SELECT TOP 1 
        t_Unternehmen.UnternehmenID,
        t_Unternehmen.Name,
        t_Unternehmer.Name AS Unternehmer
      FROM
        t_Unternehmer INNER JOIN
           (t_Unternehmen INNER JOIN
              t_Unternehmen_Unternehmer ON
            t_Unternehmen.UnternehmenID = t_Unternehmen_Unternehmer.UnternehmenID) ON
        t_Unternehmer.UnternehmerID = t_Unternehmen_Unternehmer.UnternehmerID
      ORDER BY
        t_Unternehmer.Name) tFirst ON
  tFirst.UnternehmenID = t_Unternehmen.UnternehmenID
Ich hoffe es gibt hier jemanden, der weiss, wie man solch eine Query bastelt.

Viele Grüsse und schon mal vielen Dank

Frank Geisler

MrSpock 17. Mai 2004 22:52

Re: Schwieriger SQL-Befehl
 
Hallo frankg,

versuchs mal mit:

SQL-Code:
SELECT MF.MID, MIN(M.MNAME), MIN(F.FNAME) from
MA_FIRMA MF
LEFT join FIRMA F on MF.FID=F.ID
LEFT join MITARBEITER M on MF.MID=M.ID
GROUP BY MF.MID
du musst nur noch deine Tabellen und Feldnamen einsetzen. MID ist die MitarbeiterID, FID die FirmenID.

Ich habs so ausprobiert und ich glaube, das ist was du willst.

frankg 17. Mai 2004 23:34

Re: Schwieriger SQL-Befehl
 
Hallo MrSpock!

Zunächst einmal vielen Dank für Deine Lösung, aber irgendwie scheint das hier bei mir (Access 2002) nicht zu funktionieren. Wenn ich nur das erste Left join reinnehme dann packt er die beiden Tabellen zusammen, so wie man sich das wünscht. Wenn ich nur das zweite Left join reinnehme dito. Wenn ich allerdings beide Left Joins, genau so, wie Du es hier beschrieben hast reinnehme, dann meckert Access ("Sytaxfehler (fehlender Operator) in Abfrageausdruck *hier kommen dann die beiden Left-Joins*.... Hmmm. grübel. Woran kann das denn liegen bzw. was will Access mir mitteilen? :gruebel:

Viele Grüsse und vielen Dank

Frank

Zitat:

Zitat von MrSpock
Hallo frankg,

versuchs mal mit:

SQL-Code:
SELECT MF.MID, MIN(M.MNAME), MIN(F.FNAME) from
MA_FIRMA MF
LEFT join FIRMA F on MF.FID=F.ID
LEFT join MITARBEITER M on MF.MID=M.ID
GROUP BY MF.MID
du musst nur noch deine Tabellen und Feldnamen einsetzen. MID ist die MitarbeiterID, FID die FirmenID.

Ich habs so ausprobiert und ich glaube, das ist was du willst.


PhaTTy 18. Mai 2004 06:36

Re: Schwieriger SQL-Befehl
 
Yep das hab ich auch schon so versucht, klappt wirklich nicht. Ich denke er hat Probleme mit dem GROUP BY. Mach ihn mal über alle Felder des Selects dann gehts warscheinlich.

frankg 18. Mai 2004 08:23

Re: Schwieriger SQL-Befehl
 
Zitat:

Zitat von PhaTTy
Yep das hab ich auch schon so versucht, klappt wirklich nicht. Ich denke er hat Probleme mit dem GROUP BY. Mach ihn mal über alle Felder des Selects dann gehts warscheinlich.

Hallo PhaTTy!

Vielen Dank für Deine Antwort, aber das ist es leider auch nicht. Auch wenn ich alle Felder in die Group By Klausel aufnehme, kommt immer noch derselbe Fehler.

Viele Grüsse

Frank

MrSpock 18. Mai 2004 08:38

Re: Schwieriger SQL-Befehl
 
Hallo frankg,

in die GROUP BY Klausel müssen alle Felder, die nicht in Aggregatfunktionen (hier: MIN) verwendet werden. Die anderen dürfen müssen nicht in die GROUP BY Klausel. Ich habe das Ganze unter Firebird getestet, wenn es bei Access nicht funktioniert, könntest du den JOIN auch über eine WHERE Klausel nachbilden:

SQL-Code:
SELECT MF.MID, MIN(M.MNAME), MIN(F.FNAME) from
MA_FIRMA MF, FIRMA F, MITARBEITER M
WHERE MF.FID=F.ID
AND MF.MID=M.ID
GROUP BY MF.MID
Hab ich aber jetzt nicht getetestet.

frankg 18. Mai 2004 09:32

Re: Schwieriger SQL-Befehl
 
Hallo MrSpock!

Also die Query läuft jetzt, nachdem ich die Inner Joins durch Where-Klauseln ersetzt habe (ist auch irgendwie komisch - Access unterstützt die INNER JOIN Klausel aber die Kaskadierung, so wie unter Firebird scheint nicht zu funktionieren. Soviel zum Standard SQL :wall: ). Der SQL-Befehl wird von Access nun syntaktisch akzeptiert, aber irgendwie scheint sich die Datenbank nicht viel aus dem MIN zu machen. Was ich als Ergebnis bekomme ist eine Liste mit allen Mitarbeitern aller Firmen. Das sieht im Prinzip genau so aus, als ob man nur die Joins ausgeführt hätte und es ansonsten gar keine Einschränkungen bzgl. der Datenmenge gäbe. Ich möchte aber eine Liste in der nur der alphabetisch erste Mitarbeiter jeder Firma steht. Spinnt Access hier? :gruebel:

Viele Grüsse und vielen Dank

Frank

shmia 18. Mai 2004 10:03

Re: Schwieriger SQL-Befehl
 
Zitat:

Zitat von frankg
..., aber irgendwie scheint das hier bei mir (Access 2002) nicht zu funktionieren. Wenn ich nur das erste Left join reinnehme dann packt er die beiden Tabellen zusammen, so wie man sich das wünscht. Wenn ich nur das zweite Left join reinnehme dito. Wenn ich allerdings beide Left Joins, genau so, wie Du es hier beschrieben hast reinnehme, dann meckert Access ("Sytaxfehler (fehlender Operator) in Abfrageausdruck *hier kommen dann die beiden Left-Joins*.... Hmmm. grübel. Woran kann das denn liegen bzw. was will Access mir mitteilen?

Bei Access bzw. JET-Engine müssen die JOINS geklammert werden:
SQL-Code:
... FROM (TabelleA LEFT OUTER JOIN TabelleB ON TabelleA.Feld1=TabelleB.Feld2) LEFT OUTER JOIN
TabelleC ON TabelleB.Feld3=TabelleC.Feld4

frankg 18. Mai 2004 13:27

Re: Schwieriger SQL-Befehl
 
Hallo Shmia!

Du hast Recht. Unter Access müssen die Joins geklammert werden. Nun funktioniert die Version mit den INNER JOINS auch. Was allerdings noch nicht funktioniert ist das eigentliche Problem: Mit dieser Version bekomme ich auch nur diesselbe Ergebnisdatenmenge wie mit der WHERE-Version, d.h. Es wird nicht der alphabetisch erste Mitarbeiter jeder Firma aufgelistet sondern alle Mitarbeiter aller Firmen. Irgendwie beachtet Access die MIN Funktion nicht.

Viele Grüsse und vielen Dank

Frank Geisler

MarkusB 18. Mai 2004 16:22

Re: Schwieriger SQL-Befehl
 
Hi Frank!

Dein Problem und eure Diskussion finde ich ziemlich interessant. Ob ACCESS nicht mit "MIN()“ umgehen
kann wollte ich auch checken. Deswegen habe ich folgende Abfrage gebastelt:
SQL-Code:
select min(mtab.name), ftab.name, ftab.strasse, ftab.plz, ftab.ort
from mftab, mtab, ftab
where mftab.m_id = mtab.m_id
  and mftab.f_id = ftab.f_id
group by mftab.f_id, ftab.name, ftab.strasse, ftab.plz, ftab.ort;
Es scheint zu funktionieren.

m = Mitarbeiter-Tabelle
f = Firma-Tabelle
mf= MitarbeiterFirma-Tabelle

Viele Grüße
Markus
:gruebel:

Freecer 12. Mär 2006 13:08

Re: Schwieriger SQL-Befehl
 
Hallo, interessantes thema, da ich mich selber gerade mit ziemlich dem gleichen problem herrumschlage hoffe ich das jemand von euch noch aktiv ist und mir ebenfalls beistehn kann,

Mein problem sieht prinzipiell genauso aus wie das von frankg:

3 tabellen

FirmaDV
linkdatei
PersonDV

linkdatei besteht aus 3 spalten 1: ID, 2: ueberbegriff 3: unterbegriff

Nun will ich über eine ADOQuery die sql wie ihr oben beschrieben habt übergeben (modifiziert, klarerweise!) jedoch kommt bei mir folgendes problem, er zeigt mir die gefilterten datensätze an jedoch sooft wie die anzahl der datensätze in der PERSON tabelle gespeichert! :?

Ich habe vermutet es könnte an
SQL-Code:
select *
from linkdatei, PERSONDV, FIRMADV
where linkdatei.unterbegriff = PERSONDV.zusatzid
  and linkdatei.ueberbegriff = FIRMADV.zusatzid;
an der
SQL-Code:
where linkdatei.unterbegriff = PERSONDV.zusatzid
liegen, nun wenn ich diese lösche und als das where die oben geschriebene and angebe

SQL-Code:
and linkdatei.ueberbegriff = FIRMADV.zusatzid;
kommt das von mir besagte problem das die 3 einträge sooft gelistet werden wie einträge in der PERSON tabelle sind :?

hoffe ich hab das so erklärt das es richtig rüberkommt! :)

p.s. hoffe es stört nicht das ich dne thread wieder raufschiebe :? -> Is doch nicht mehr der jüngste :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:45 Uhr.

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