AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Schwieriger SQL-Befehl
Thema durchsuchen
Ansicht
Themen-Optionen

Schwieriger SQL-Befehl

Ein Thema von frankg · begonnen am 17. Mai 2004 · letzter Beitrag vom 12. Mär 2006
Antwort Antwort
Seite 1 von 2  1 2      
frankg

Registriert seit: 20. Mai 2003
Ort: Wetter
72 Beiträge
 
Delphi 7 Architect
 
#1

Schwieriger SQL-Befehl

  Alt 17. Mai 2004, 18:03
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 ). 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
Miniaturansicht angehängter Grafiken
mitarbeiter.gif  
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Schwieriger SQL-Befehl

  Alt 17. Mai 2004, 21:52
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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
frankg

Registriert seit: 20. Mai 2003
Ort: Wetter
72 Beiträge
 
Delphi 7 Architect
 
#3

Re: Schwieriger SQL-Befehl

  Alt 17. Mai 2004, 22:34
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?

Viele Grüsse und vielen Dank

Frank

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.
  Mit Zitat antworten Zitat
PhaTTy

Registriert seit: 16. Mai 2004
Ort: Laupheim
40 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Schwieriger SQL-Befehl

  Alt 18. Mai 2004, 05:36
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.
Make it idiot-proof and someone will invent a better idiot...
  Mit Zitat antworten Zitat
frankg

Registriert seit: 20. Mai 2003
Ort: Wetter
72 Beiträge
 
Delphi 7 Architect
 
#5

Re: Schwieriger SQL-Befehl

  Alt 18. Mai 2004, 07:23
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
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#6

Re: Schwieriger SQL-Befehl

  Alt 18. Mai 2004, 07:38
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.
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
frankg

Registriert seit: 20. Mai 2003
Ort: Wetter
72 Beiträge
 
Delphi 7 Architect
 
#7

Re: Schwieriger SQL-Befehl

  Alt 18. Mai 2004, 08:32
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 ). 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?

Viele Grüsse und vielen Dank

Frank
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: Schwieriger SQL-Befehl

  Alt 18. Mai 2004, 09:03
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
Andreas
  Mit Zitat antworten Zitat
frankg

Registriert seit: 20. Mai 2003
Ort: Wetter
72 Beiträge
 
Delphi 7 Architect
 
#9

Re: Schwieriger SQL-Befehl

  Alt 18. Mai 2004, 12:27
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
  Mit Zitat antworten Zitat
MarkusB

Registriert seit: 3. Apr 2004
Ort: Hamburg
105 Beiträge
 
#10

Re: Schwieriger SQL-Befehl

  Alt 18. Mai 2004, 15:22
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 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