Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Abfrage in einer n:M Beziehung?

Begonnen von silentwolf, Mai 30, 2011, 09:57:33

⏪ vorheriges - nächstes ⏩

silentwolf

Hallo hab mal wieder ein Problem  ::)
Ich habe eine n:m Beziehung und würde gern alle Daten finden per Abfrage die keine dazugehörigen Datensätze haben.
Also eine tabelle heist tblKunde und eine tblProjekte die Zwischentabelle tblKunProj.
Da nicht alle Projekte einen dazugehörigen Kunden derzeit aufweisen würde ich gern mit einer Abfrage nur die Projekte finden die keinen Kunden haben.
Leider funktioniert das noch nicht so wie ich das möchte :(
Vieleicht könnte mir jemand dabei helfen bitte?

Lg Albert

MzKlMu

Hallo,
erstelle eine Abfrage mit den Beziehungen. Klicke die Beziehungslinie zwichen Kunde und Projekt doppelt und ändere den Beziehungstyp. 2 oder 3 dürfte passen.
Gruß Klaus

ebs17

ZitatDa nicht alle Projekte einen dazugehörigen Kunden derzeit aufweisen würde ich gern mit einer Abfrage nur die Projekte finden die keinen Kunden haben.
Das heißt auf deutsch: Alle Projekte (der Projekttabelle), die in der Zwischentabelle nicht vorkommen = Inkonsistenzprüfung.
SELECT P.*
FROM tblProjekte P
WHERE NOT EXISTS
(SELECT Null
FROM tblKunProj Z
WHERE P.ProjectID = Z.fProjectID)

MfGA
ebs

silentwolf

Hallo und Danke für Eure antworten.
Hab leider noch nicht glück gehabt :(
Ich muss es sicherlich noch umändern aber ich weis noch nicht wie :(
tblKunde hat als PK Kun_id
tblProjekte hat als PK Pr_id
tblKunProj hat Pr_id_f als PK und Kun_id_f als Pk
Könnte mir bitte jemand noch sagen wie ich den Code umändern muss?

ZitatSELECT P.*
FROM tblProjekte P
WHERE NOT EXISTS
(SELECT Null
FROM tblKunProj Z
WHERE P.ProjectID = Z.fProjectID)

Vielen Dank für Eure Hilfe und es tut mir leid das ich es nicht selbst hinbekomme :(

ebs17

Zitattut mir leid das ich es nicht selbst hinbekomme
Du solltest Dich bei Dir selber entschuldigen.

Aber statt alles komplett zu kopieren solltest Du die Anweisung auch ein wenig verstehen. Daher lasse ich Dir die Gelegenheit, das selbst zu vervollständigen.
Grundlagen kannst Du aus dem SQL-Tutorial von Jürgen Auer beziehen.

Zur Anweisung: Welche ID´s zum Verknüpfen zu verwenden sind, siehst Du an der Beziehung zwischen Projekttabelle und Zwischentabelle.

ZitattblKunProj hat Pr_id_f als PK und Kun_id_f als Pk
Das dürfte so nicht ganz in Ordnung sein. Beide Fremdschlüssel dürften gemeinsam einen zusammengesetzten eindeutigen Schlüssel ergeben (der notfalls auch als PK genutzt werden könnte, ein einfacher zusätzlicher Autowert wäre aber praktikabler). Aber jeder für sich als PK lässt eine m:n-Beziehung nicht zu.

MfGA
ebs

oma

Hallo Albert,

ich denke, die von ebs angegebene Abfrage brauchst du nicht ändern! (außer einen kleinen Schreibfehler, den du sicher schon bemerkt hast)

Wenn du Verständigungsprobleme damit hast, probiere mal folgen Abfrage ( wie von Klaus angesprochen), ob diese deinen Verständnis mehr entspricht:

SELECT Projekt, Kunde
FROM (tblKunProj
  LEFT JOIN tblKunde ON tblKunProj.Kun_ID = tblKunde.Kun_ID)
  RIGHT JOIN tblProjekte ON tblKunProj.Pr_ID = tblProjekt.Pr_ID
WHERE Kunde Is Null


Was auch wichtig ist: Wieso kommen in der Tabelle tblKunProj  überhaupt Projekte ohne Kunden vor?
Das ist sicherlich beim Eingeben in der Tabelle passiert; du solltest deinen Usern so etwas nicht gestatten; Daten nur in Formulare eingeben. u. wenn du hierbei die Tabellen richtig verknüft hast, kann so etwas nicht geschehen:

Gruß Oma
nichts ist fertig!

ebs17

Zitataußer einen kleinen Schreibfehler
Den würde ich gerne gezeigt bekommen, da ich ihn nicht sehen kann.
ZitatWieso kommen in der Tabelle tblKunProj  überhaupt Projekte ohne Kunden vor?
Ist das Wissen oder eine Behauptung?

MfGA
ebs

silentwolf

Hallo an alle die mir hier bei diesen thread helfen!!
Also da meine DB bzw. meine Firma schon eine Weile existiert wurden Projekte in der Projekt Tabelle erfasst und na ja es wurden noch nicht alle Projekte mit den dazugehörigen Kunden erfasst.
Um mir zu ersparen das ich jedes Projekt durchsuchen muss hätte ich gerne eine Abfrage gehabt die mir anzeigt welche Projekte noch ohne Kunden sind.
Also ist es Wissen und nicht Behauptung ggg :) Oder ein guter Sinn für was ein Anfänger wie ich eben so falsch machen kann :)
Wie auch immer..
Leider hab ich nicht immer viel Zeit um mich mit der DB zu befassen und ich hab natürlich versucht das in meinem Fall umzusetzen aber ich verstehe es halt noch nicht ganz.
Werde die SQL abfrage von Oma mir morgen hoffentlich anschauen können und Euch berichten ob ich es geschafft hab :)
In der Zwischenzeit wollte ich mich nur schnell bei Euch bedanken für die vielen Tipps und Tricks!
Lg Albert

ebs17

Zitatwurden Projekte in der Projekt Tabelle erfasst und na ja es wurden noch nicht alle Projekte mit den dazugehörigen Kunden erfasst
Eine Lösung einer Aufgabe beginnt mit der präzisen Beschreibung der Aufgabe. Die fehlt mir hier noch ein wenig und gibt dann Raum für Interpretationen mit sehr unterschiedlichen Vorschlägen:
1) Projekte sind in der Projekte-Tabelle erfasst, aber noch nicht (per Zuordnungstabelle) Kunden zugeordnet. Damit befasst sich mein o.g. Vorschlag.
2) Die Projekte stehen auch schon in der Zuordnungstabelle, allerdings fehlen dort (teilweise) die Fremdschlüssel zur Kunden-Tabelle. Damit befasst sich der Vorschlag von Oma.

Im letzteren würde ich bemängeln, dass erst alle Tabellen zusammengefasst werden (Datenmenge wird erzeugt) und erst danach eine Filterung erfolgt. Das mag im Sinne des "Zusammenklickens" einer Abfrage im Abfrageeditor die einfache und verständliche Variante sein.
Vom Abfrageablauf und letztlich der benötigten Zeit her wird es aber effektiver sein, erst die Zuordnungstabelle zu filtern (Datenmenge begrenzen) und dann mit anderen Tabellen zu joinen, um benötigte Klarwerte dazu zu bekommen. Dabei fällt dann auch auf, dass das Hinzuziehen der Kundentabelle sinnfrei ist, da es eben für die gesuchten Datensätze keine Kundenzuordnung gibt.
Die eigentliche Abfrage (Variante 2)
SELECT Pr_id_f
FROM tblKunProj
WHERE Kun_id_f Is Null

' im Verbund mit Projekte-Tabelle
SELECT P.*
FROM tblProjekte P
INNER JOIN
(SELECT Pr_id_f
FROM tblKunProj
WHERE Kun_id_f Is Null) Q
ON P.Pr_id = Q.Pr_id_f


MfGA
ebs

oma

Hallo ebs,

du hast sicher mit deinen Hinweisen zur unklaren Fragestellung Recht.
Das ist in vielen Fällen im Forum so (und nicht nur in diesem) und eine Möglichkeit zur Hilfe  besteht dann in einer klärenden Nachfrage!

Die Lösungsvorschläge von Helfern sind dann nicht immer auf Abfrageablaufoptimierung oder sonstiges zu sehen, sondern im Sinne einer Beseitigung des Problems u. unter Umständen als einfache u. verständliche Variante zur Erläuterung des Problems zushen.

In diesem Sinne Klicke ich gerne im Abfrageditor etwas zusammen um evt. jemanden damit zu helfen ;D

Gruß Oma
nichts ist fertig!

silentwolf

Hallo,
Also ich versuche es noch etwas deutlicher zu erklären was ich im moment bzw. wie die Daten im Moment sind.
In der tblKunProj (das ist die Zwischentabelle) sind momentan 58 Datensätze enthalten die alle ein Projekt und einen Kunden haben.
Also Pr_id_f keine fehlenden Daten und Kun_id_f auch keine fehlenden Daten.
In der tblProjekte gibt es im gegenzug 66 Datensätze :) also wollte ich gern wissen welche Projekte noch keinen dazugehörigen Kunden haben.
Wahrscheinlich hätte ich es doch gleich durchsuchen können ggg aber da lernt man halt auch nichts. Beim Abschreiben auch nicht aber da kann wenn es funktioniert herausfinden warum es so ist.
Nur hab ich nicht mit SQL gearbeitet deshalb hätte ich gerne etwas hilfe bekommen.

Vielen Dank nochmals

Albert

silentwolf

Man glaubt es kaum aber ich habe es herausbekommen :)
Das ist nun mein SQL Statement

SELECT P.*
FROM tblProjekte AS P
WHERE NOT EXISTS
(SELECT Null
FROM tblKunProj Z
WHERE P.Pr_id = Z.Pr_id_f);

Wenn ich nun die Abfrage das zweite mal öffne dann kommt eine Parametereingabe. Warum ist das??
Was bedeutet das Select P.*
From tblKunProj Z also was bedeutet Z und P

Danke :)

database

Hallo Albert,

Zitatalso was bedeutet Z und P

Das sind sogenannte Aliase für die Tabellennamen um selbige im SQL-Statement nicht ausschreiben zu müssen.
So z.B. hier ...  P.Pr_id = Z.Pr_id_f   ...  was eben ausgeschrieben ...   tblProjekte.Pr_id = tblKunProj.Pr_id_f   ....  lauten würde.

Man verwendet solche Aliase gerne dann, wenn lange Tabellennamen oftmals zu schreiben wären, wie es beispielsweise manchmal in der Spaltenliste vorkommen kann.


ebs17

P, Z sind (willkürlich wählbare) kurze Aliasnamen für die Tabellenbezeichnung, das "AS" davor kann, muss man aber nicht verwenden. Die Festlegung des Alias erfolgt jeweils im FROM-Abschnitt.

Aliase haben eine Reihe von Vorteilen:
- Sie sparen Schreibarbeit, insbesondere bei langen Tabellenbezeichnungen.
- Sie erhöhen die Übersicht, besonders bei langen und sehr ähnlichen Tabellenbezeichnungen.
- Sie vereinfachen die Einbindung von Unterabfragen und deren Feldern.
- Sie ermöglichen einen SELF JOIN (Verknüpfung einer Tabelle mit sich selbst).
- Sie sparen Änderungsarbeit (z.B. bei Tausch einer Tabelle innerhalb der Abfrage).

Eine Parameternachfrage dürfte bei dieser Abfrage nicht kommen. Dort hast Du vermutlich noch zusätzliche Störgrößen.
Eine Abfrage mit gleichem Ergebnis, aber anderem Aufbau kannst Du Dir übrigens selbst erstellen. Im Abfrageeditor gibt es einen Assistenten zur Erstellung einer Inkonsistenzabfrage. Inkonsistenz: Datensätze in Tabelle A, die in Tabelle B nicht vorhanden sind.

@Oma: Klar kann man es so machen.
Recht oft ist aber die Verständnisfähigkeit des Fragestellers deutlich höher, als es die Fragestellung erwarten lässt. Wenn nicht, erfährt man das i.d.R. bei der folgenden Rückantwort.
An der Stelle wollte ich kenntlich machen, dass eine Lösung nicht die Lösung sein muss, die im folgenden immer abzuschreiben ist. Was ist hilfreicher? Die einfache schnelle Hilfe? Der etwas anspruchsvollere aber nachhaltige Tipp?
Den Fragesteller darf man an der Stelle nicht fragen: Der Ertrinkende greift nach jedem Strohhalm. Ich sehe es als hilfreich an, wenn man neben dem schnellen Tipp auch eine Ahnung/Kenntnis vermittelt, wie es auch sein könnte oder sollte.


MfGA
ebs

silentwolf

Hallo an alle!!
Vielen Dank für die Antworten!
Jetzt weis ich natürlich schon wieder mehr gg :)
Die Parameterabfrage muss ich mir noch anschaun...warum es vorkommt.
Aber das dauert halt bei mir doch noch ein wenig länger ggg
Also alles gut soweit :)
Vielen Dank an alle die immer mir soo viel Helfen!!!

Lg Albert