![]() |
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:
Ich hoffe es gibt hier jemanden, der weiss, wie man solch eine Query bastelt.
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 Viele Grüsse und schon mal vielen Dank Frank Geisler |
Re: Schwieriger SQL-Befehl
Hallo frankg,
versuchs mal mit:
SQL-Code:
du musst nur noch deine Tabellen und Feldnamen einsetzen. MID ist die MitarbeiterID, FID die FirmenID.
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 Ich habs so ausprobiert und ich glaube, das ist was du willst. |
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:
|
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.
|
Re: Schwieriger SQL-Befehl
Zitat:
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 |
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:
Hab ich aber jetzt nicht getetestet.
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 |
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 |
Re: Schwieriger SQL-Befehl
Zitat:
SQL-Code:
... FROM (TabelleA LEFT OUTER JOIN TabelleB ON TabelleA.Feld1=TabelleB.Feld2) LEFT OUTER JOIN
TabelleC ON TabelleB.Feld3=TabelleC.Feld4 |
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 |
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:
Es scheint zu funktionieren.
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; m = Mitarbeiter-Tabelle f = Firma-Tabelle mf= MitarbeiterFirma-Tabelle Viele Grüße Markus :gruebel: |
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:
an der
select *
from linkdatei, PERSONDV, FIRMADV where linkdatei.unterbegriff = PERSONDV.zusatzid and linkdatei.ueberbegriff = FIRMADV.zusatzid;
SQL-Code:
liegen, nun wenn ich diese lösche und als das where die oben geschriebene and angebe
where linkdatei.unterbegriff = PERSONDV.zusatzid
SQL-Code:
kommt das von mir besagte problem das die 3 einträge sooft gelistet werden wie einträge in der PERSON tabelle sind :?
and linkdatei.ueberbegriff = FIRMADV.zusatzid;
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