Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: silentwolf am Mai 30, 2011, 09:57:33

Titel: Abfrage in einer n:M Beziehung?
Beitrag von: silentwolf am Mai 30, 2011, 09:57:33
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
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: MzKlMu am Mai 30, 2011, 10:06:10
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.
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: ebs17 am Mai 30, 2011, 10:32:25
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
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: silentwolf am Mai 30, 2011, 11:28:22
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 :(
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: ebs17 am Mai 30, 2011, 15:15:01
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
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: oma am Mai 30, 2011, 16:47:34
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
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: ebs17 am Mai 30, 2011, 19:02:42
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
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: silentwolf am Mai 30, 2011, 20:50:54
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
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: ebs17 am Mai 31, 2011, 11:45:07
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
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: oma am Mai 31, 2011, 12:54:32
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
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: silentwolf am Mai 31, 2011, 16:16:41
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
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: silentwolf am Mai 31, 2011, 16:25:17
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 :)
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: database am Mai 31, 2011, 17:04:51
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.

Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: ebs17 am Mai 31, 2011, 17:19:31
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
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: silentwolf am Mai 31, 2011, 18:08:06
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
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: oma am Mai 31, 2011, 19:44:18
Hallo,

@Albert: sorry, dass wir uns auch noch neben dem Thema austauschen.

@ebs:
ZitatIch sehe es als hilfreich an, wenn man neben dem schnellen Tipp auch eine Ahnung/Kenntnis vermittelt, wie es auch sein könnte oder sollte
.

da hast du uneingeschränkt Recht!

Gruß Oma
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: database am Mai 31, 2011, 21:13:47
Hallo Albert,

sieh mal da rein:
http://www.donkarl.com?FAQ3.16 (http://www.donkarl.com?FAQ3.16)

Wenn du nun Karl Donaubauers Tipp auf deine Datenbank umlegst, würde die Syntax der Abfrage ganz einfach so lauten:


SELECT P.*
   FROM tblProjekte P
       LEFT JOIN tblKunProj KP
       ON P.Pr_id = KP.Pr_id_f
WHERE KP.Pr_id_f  Is Null


Als Ergebnis erhältst du alle Spalten der Tabelle tblProjekte und als Inhalt jene Datensätze, die in der Tabelle tblKunProj keine Entsprechung haben.
Durch den LEFT JOIN in dieser Abfrage werden zur Ergebnisbildung ALLE Datensätze der Tabelle tblProjekte herangezogen und nur jene angezeigt, bei denen
nach der abfragetechnischen Verknüpfung der Tabellen im Feld tblKunProj.Pr_id_f  NULL enthalten ist.

Du kannst das leicht überprüfen in dem du die Abfrage ein klein wenig abänderst und das Feld tblKunProj.Pr_id_f ins Ergebnis mit einbindest:


SELECT P.*, KP.Pr_id_f
   FROM tblProjekte P
       LEFT JOIN tblKunProj KP
       ON P.Pr_id = KP.Pr_id_f
WHERE KP.Pr_id_f  Is Null


Somit ist die SQL um Einiges kürzer und auch für dich leichter lesbar
PLUS - Vorteil: diese Abfrage kannst du 100te mal ausführen ...  ohne Parameterfrage  ;)
Was allerdings auch mit DEINER Version gelingt - keine Ahnung warum du die Parameterfrage gestellt bekommst.

ZitatAber das dauert halt bei mir doch noch ein wenig länger
Macht nix, wir haben Geduld und ich glaube dass wir hier in diesem Forum bereits einige tausendmal gezeigt haben,
dass wir Fragen so beantworten können, dass
erstens die Antwort stimmt,
zweitens das Ergebnis richtig war und
drittens dem Fragesteller nicht nur ein Ergebnis vor die Nase gesetzt und kurzfristig aus der Patsche geholfen wurde
sondern auch die benötigte Erkärung mitgeliefert wurde und zwar SO, dass der FS wusste worum's geht - nachhaltig

@ebs:
ZitatBeide Fremdschlüssel dürften gemeinsam einen zusammengesetzten eindeutigen Schlüssel ergeben
Die beiden Fremdschlüssel bilden einen zusammengesetzten PK - richtig erkannt

Zitat(der notfalls auch als PK genutzt werden könnte, ein einfacher zusätzlicher Autowert wäre aber praktikabler).
Nix Notfall und nix praktikabler, da durch obige einfache Konstellation gewährleistet ist, dass keines der FK-Felder leer bleibt,
was in der praktikablen Version wiederum nur durch einen zusätzlich zu erzeugenden Index erreichbar gewesen wäre.
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: ebs17 am Mai 31, 2011, 22:04:41
ZitatDie beiden Fremdschlüssel bilden einen zusammengesetzten PK - richtig erkannt
Nix Notfall und nix praktikabler ...
Dieser absoluten Verkündigung (so klingt es zumindest) möchte ich dann auch widersprechen:
Für die Fremdschlüsselkombination ist ein zusammengesetzter eindeutiger Index sinnvoll bis notwendig, Primärschlüssel muss er jedoch nicht sein. Dort schätze ich ein normales Autowertfeld bedeutend mehr, der zusätzliche Index belastet innerhalb der 32 möglichen Indices nicht wirklich.

Der Einfeld-PK ist sehr praktikabel. Wenn man Tabellen und (Unter)Abfragen zu richtigen Abfragen verknüpft, und das funktional und nicht nur durch Zusammenklicken und gesteuert über Beziehungen, ist es nicht unerheblich, ob ich da jedes Mal einen Mehrfelderindex verwenden muss oder ob ich einen Einfeld-Schlüssel verwenden kann. Das betrifft zum einen den Umfang für die Gesamtabfrage an sich, zum anderen schließt ein Mehrfelder-PK eine Konstruktion wie "WHERE Feld IN (SELECT ...)" aus, wodurch dann in Umgehung gleich wieder zwei, drei zusätzliche Ebenen in der Verschachtelungstiefe innerhalb der Abfrage entstehen.

Zitatda durch obige einfache Konstellation gewährleistet ist, dass keines der FK-Felder leer bleibt
Sauberes Tabellenfüllen ist wichtig und Basis für alles folgende. Im Mittelpunkt steht aber für mich Datenverarbeitung, nicht die Datenerfassung.

Daher bekräftige ich meine Aussage, dass ein Mehrfelder-PK primär ein Notfall ist, und bin gespannt auf Gegenargumente.

MfGA
ebs
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: oma am Mai 31, 2011, 23:14:16
Hallo,

ZitatDaher bekräftige ich meine Aussage, dass ein Mehrfelder-PK primär ein Notfall ist, und bin gespannt auf Gegenargumente.

wir entfernen uns aber ziemlich vom Thema.

Zur obigen  Aussage hatte ich hier im Forum schon einmal einen ziemlichen Streit.  Ich mache grundsätzlich zu jeder Tabelle immer ein ID als PK  mit Felddatentyp Autowert;  für mögliche Datenkonsistenzprüfung anderer Felder lege ich dann evt. einen zusammengesetzten Index an. Ein Mehrfelder-PK  habe ich noch nie benötigt; als Notfall würde ich das aber auch nicht bezeichnen, da immerhin möglich.

ZitatSauberes Tabellenfüllen ist wichtig und Basis für alles folgende. Im Mittelpunkt steht aber für mich Datenverarbeitung, nicht die Datenerfassung.

naja, ich habe Anwendungen zu betreuen, in der täglich 10-25 User heftig Daten eingeben. Da ist Datenerfassung schon wichtig und die Datenverarbeitung (Auswertungen)  ist relativ zeitunkritisch.

Es kommt eben immer auf die Anforderungen und spezifischen Bedingungen an.

Gruß Oma
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: ebs17 am Juni 01, 2011, 00:25:16
Zitatwir entfernen uns aber ziemlich vom Thema.
Das eigentliche Thema erscheint mir geklärt, die Parameternachfrage ist mit den gezeigten Abfragen nicht zu erklären. Und ich denke, Albert hat gegen die unbeabsichtigte Horizonterweiterung über die Problemklärung an sich hinaus nicht wirklich etwas einzuwenden. Sichtbar lernt er gerne dazu.

Nix und Basta provozieren aber gerade die Rückfrage nach der versprochenen benötigten Erklärung.

Zitatdie Datenverarbeitung (Auswertungen)  ist relativ zeitunkritisch
Nun, Theorie und Umsetzung von Datenmodellierung und Normalisierung (= gesammelten Erfahrungen) dienen in hohem Maße dazu, dem Rennwagen SQL als Datenbanksprache Nummer 1 die notwendige Rennstrecke bereit zu stellen. SQL ist eindeutig Verarbeitung von Daten.
Zum puren Eingeben und Sammeln von Daten wären auch Excel-like-Strukturen oder sogar Textdateien geeignet. Möglich sind sie auf jeden Fall, verwendet werden sie durchaus auch. Ob sie erste Wahl sind (das meinte ich präziser mit Nichtnotfall), mag jeder für sich und entsprechend seinen Anforderungen  beurteilen.

MfGA
ebs
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: silentwolf am Juni 01, 2011, 08:08:46
Hallo an alle :)
Ja ich habe mal überhaupt nix dagegen wenn Ihr diskutiert und wenn es etwas ausscheifend ist!
Lern ja auch mit und das ist sicher nicht schlecht :)
Leider wieder etwas wenig Zeit aber für ein kurzes Dankeschön reicht es auf alle male!

Lg Albert
Titel: Re: Abfrage in einer n:M Beziehung?
Beitrag von: database am Juni 01, 2011, 09:47:24
Hi,

Zitatund bin gespannt auf Gegenargumente
KEINE

Ich bin in keiner Weise daran interessiert irgendwelche Grundsatzdiskussionen zu führen, die sowieso niemanden was helfen.
Diese Art von Argumentationen kenn ich zur Genüge

EOF