Juli 13, 2020, 23:53:21

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


JOIN Abfrage verschachtel mit mehreren Tabellen

Begonnen von hmfmartin, Mai 25, 2010, 18:13:36

⏪ vorheriges - nächstes ⏩

hmfmartin

Hallo,
Ich habe folgendes Problem ich möchte mit eine Abfrage erstellen wo nur Kunden angezeigt werden die einen Artikel bestellt haben der mit 'E' beginnt.

Ich habe 4 Tabellen

T_Artikel
*artikelnummer
*bezeichnung

T_Position
*bestell_nr
*artikelnummer

T_Kunde
*K_nr
*name

T_Bestellungen
*bestell_nr
*k_NR


SELECT  T_Kunden.name
FROM T_Kunden INNER JOIN
WHERE T_Artikel.bezeichnung LIKE 'E*';


muss ich jetzt alle 4 Tabellen verknüpfen mit einem JOIN oder geht dies auch einfacher???
Wie sieht so ein verknüpfter JOIN aus???

Gruß
martin

MzKlMu

Hallo,
Du solltest eigentlich bereits im Beziehungsfenster die Beziehungen anlegen.
Für Deine Abfrage brauchst Du alle 4 Tabellen mit den Beziehungen. Wenn im Beziehungsfenster diese angelegt sind, werden diese von der Abfrage automatisch übernommen.
Die Tabellen müssen zwingend in Beziehung stehen ((Join). Nein, einfacher geht es nicht.
Gruß
Klaus

database

Hallo Martin,
erstmal folgendes:
ZitatWie sieht so ein verknüpfter JOIN aus

So etwas gibt es nicht - einen verknüpften Join.
Mittels eines JOIN (ist nix zum Rauchen) wird zwischen zwei Tabellen eine Beziehung hergestellt.
Habe in der Antwort zu deiner vorangegangenen Frage eine Abfragevariante mit JOINS angeboten!

Wenn so, wie MzKlMu bereits richtig erwähnt hat, die Beziehungen zwischen den Tabellen im Vorfeld im Beziehungsfenster festgelegt sind, sind diese Tabellen bereits 'verJoint'.

Ziehst du die Tabellen in den Abfrageeditor siehst du die Beziehungslinien zwischen den Tabellen, gibst du Kriterien an und schaust dir danach (Rechtsklick in den Tabellenbereich und auswählen SQL-Ansicht) die SQL der Abfrage an kannst du die Joins herauslesen.
SQL = Structured Query Language ----  quasi die Standardabfragesprache im Umfeld von relationalen Datenbanken.

Die Deklaration dieser Joins erfolgt sinngemäß immer auf die gleiche Weise:

Tabelle1 INNER JOIN Tabelle2
ON Tabelle1.Primärschlüssel = Tabelle2.Fremdschlüssel

Wobei nun die Beziehung für die Abfrage der beiden Tabellen so ausgelegt ist, dass im Ergebnis die Inhalte der verknüpften Felder gleich ist (INNER JOIN).
Dazu gibts jede Menge Literatur im Netz der Netze - würde dir empfehlen dich mit SQL näher zu beschäftigen, wenn du des Öfteren mit Abfragen zu tun hast!

Nun zu deiner Frage:

SELECT T_Position.bestell_nr, T_Kunde.KName, T_Artikel.Bezeichnung
FROM (T_Kunde INNER JOIN T_Bestellungen ON T_Kunde.k_nr = T_Bestellungen.k_nr)
INNER JOIN (T_Artikel INNER JOIN T_Position ON T_Artikel.Artikelnummer = T_Position.Artikelnummer)
ON T_Bestellungen.bestell_nr = T_Position.bestell_nr
WHERE ((Left([Bezeichnung],1)="E"));


Diese Abfrage mit VERSCHACHTELTEN JOINS sollte das von dir erwartete Ergebnis liefern.
Ich habe für das Kriterium Links(Bezeichnung;1)="E" genommen, da diese Variante der Kriterienangabe keinen Tablescan verursacht der bei sehr umfangreichen Tabellen recht an der Performance kratzt.

HTH

Peter

Josef

ZitatIch habe für das Kriterium Links(Bezeichnung;1)="E" genommen, da diese Variante der Kriterienangabe keinen Tablescan verursacht der bei sehr umfangreichen Tabellen recht an der Performance kratzt.

War das ein Tippfehler ... oder funktionierte mein Ironie-Detektor nicht? :)
Left([Bezeichnung],1)="E" erzeugt auch bei einem Index über Bezeichnung immer einen Scan und niemals ein Seek.

mfg
Josef

database

 Hallo Josef,

Zitatoder funktionierte mein Ironie-Detektor nicht

Aha, gibts das im Elektrohandel oder ist das akademischer Eigenbau??

nein kein Tippfehler aber durch die Länge des Textes hat es den ganzen Text nicht mehr angezeigt und mir ist nicht aufgefallen dass da ein Teil vom Satz gefehlt hat - da fehlen fast 2 Zeilen - ist aber interessant, dass trozdem das Ganze lesbar und ohne Grammatikfehler dasteht - ist vermutlich beim Ausbessern eines Rechtschreibfehlers passiert :)

ZitatLeft([Bezeichnung],1)="E" erzeugt auch bei einem Index über Bezeichnung immer einen Scan
na no na net
Gehe davon aus, dass im Fall der Suche nach dem ganzen Wort bei indiziertem Feld ein Seek veranlasst wird und somit die Suche über den Index ausgeführt wird. ;)

Aber egal die Erklärung wäre vielleicht auch zu umfangreich und umständlich ausgefallen also streichen wir den Satz.
Greets
Peter

hmfmartin

Hallo Peter,
erstmal danke für deine Hilfe, ich habe auch den code aus meiner anderen Frage verwendet und hat beides gut funktioniert.

;)

Also dann.....

gruß

martin