Datenbanbkabfrage über 3 Tabellen

awexb

Benutzer
Beiträge
5
Hallo liebe Forenmitgllieder,

ich bin gerade dabei mein erstens kleines Programm basierend auf einer Micsodoft SQL Datenbak zu programmieren. Hierzu möchte ich eine Datenbakabfrage über 3 Tabellen erstellen, wobei ich leider derzeit an meine Grenzen stoße. Vielleicht kann mir jemand von eiuch weiterhelfen.

Situationsbeschreibung:

Tabelle A: Identnummer_A, Suchparameter_1, Suchparameter_2, Suchparameter_3,
Tabelle B: Identnummer_B, Suchparameter_1, Suchparameter_2, Suchparameter_3,
Tabelle C: Identnummer_A, Identnummer_B

Meine Abfrage soll folgende Ergebnisse zeigen:

Mit der Identnummer_A von Tabelle A samt aller Suchparameter soll eine Suche auf Tabelle B unter Berücksichtigung jener Suchparameter ausgeführt werden.

sSQL = "SELECT MIETER_ID, ANREDE, NACHNAME, EMAILADRESSE FROM MIETER WHERE STADT = '" & Field("STADT") & "' AND STADTTEIL = '" & Field("STADTTEIL") & "'" &_
"AND ZIMMERANZAHL >= '" & Field("ZIMMERANZAHL") & "' AND GROESSE >= '" & Field("GROESSE") & "'" &_
"AND WARMMIETE <= '" & Field("WARMMIETE") & "' AND MIETBEGINN >= '" & Field("MIETBEGINN") & "'"

Das klappt soweit ganz gut. Nun mein Problem:
Die Suchergebnisse sollen unter Berücksichtigung von Tabelle C in der immer eine Kombination aus Identnummer_A und Identnummer_B steht, weiter eingegrenzt werden. Wenn also bereits eine solche Kombination in Tabelle C steht, dürfen diese Ergebnisse nicht mehr in der Abfrage erscheinen.

Kann mir jemand bei der Formulierung dieser Abfrage helfen?
Vielen Dank schonmal im Voraus.
 
Werbung:
Hallo Distilec,

danke für deine Antwort. Hier die gewünschten Informationen: (siehe Bilder)

Mein Ziel ist es für Mieter sowie für Vermieter Vorschläge zu generieren und dierse dann per Email zu versenden.
Um dopplete Emails zu vermeiden, schreibe ich die Kombionation aus Mietobjekt und Mieter in eine Historientabelle (Tabelle C).

Viele Grüße
 

Anhänge

  • Tabelle_A.png
    Tabelle_A.png
    22,4 KB · Aufrufe: 7
  • Tabelle_B.png
    Tabelle_B.png
    22,2 KB · Aufrufe: 7
  • Tabelle_C.png
    Tabelle_C.png
    7,6 KB · Aufrufe: 5
Also gut... Schritt 1 hätten wir.
Nun zu Schritt 2:
Nun mein Problem:
Die Suchergebnisse sollen unter Berücksichtigung von Tabelle C in der immer eine Kombination aus Identnummer_A und Identnummer_B steht, weiter eingegrenzt werden. Wenn also bereits eine solche Kombination in Tabelle C steht, dürfen diese Ergebnisse nicht mehr in der Abfrage erscheinen.
Was heißt "Wenn also bereits eine solche Kombination in Tabelle C steht"... Soll dann garnichts angezeigt werden? Oder nur die Werte von Tabelle_A ? Oder doch die von Tabelle_B?

Stehen denn bei gleicher Identnummer in beiden Tabellen auch die gleichen Werten drinn?
Wenn Ja ist die Tabelle C vollkommen unnötig, denn:
Code:
Select *
From tab_a
Union
Select *
From tab_b
gäbe das richtige Ergebnis...
 
Hallo :)

ich umschreibe das gesamte Konstrukt mal etwas detailierter, damit du einen besseren Einstieg in meine Gedanken erhälst:

In der Mieter Tabelle werden alle potenteiellen Mieter mit deren "Wünschen" eingetragen (Stadt, Stadteil, Wohnungsgröße, Maximale Miete)
In der Vermieter Tabelle werde alle Mietobjekte mit deren Informationenen eingetragen (Stadt, Stadteil, Wohnungsgröße, Mietpreis)

Sofern sich ein neuer Mieter in die Datenbank einträgt, sollen anhand der Suchkriterien Mietobjekte vorgeschlagen werden, die dann an den Mieter versendet werden.
Da es nach kurzer Zeit sehr unübersichtlich wird, welcher Meiter welches Mietobjekt als Email erhalten hat, schreibe ich die Kombination aus Mieter und Mietobjekt (IDENTNUMMERN) in eine Historientabelle.
Bei erneueter Generierung von Mietobjektvorschlägen, darf das soeben via Email versandet Mietobjekt nicht mehr in der Abfrage erscheinen. Hierzu soll diese Historientablle einbezogen werden.
 
Ok... Das gibt mir ja schon einmal einen generellen Überblick...

Da ich aber immer noch nicht so wirklich weiß, was für Daten du haben willst mal ein recht "offenes" Statement:
Code:
Select b.*
From   tab_b b

Inner  Join tab_a a
On     a.suchparam1 = b.suchparam1
And    a.suchparam2 = b.suchparam2
And    a.suchparam3 = b.suchparam3

Where Not Exists (Select 1 From tab_c c Where c.mieter = a.mieter_id And c.vermieter = b.vermieter_id)
 
Hallo und vielen Dank für deine Antwort.

Ich habe deinen Code in meine Abfrage eingebaut und einen Teilerfolg erzielt.
Dazu habe ich wieder 3 Screenshots angefertigt.

1. Abfrage mit Tabelle A und Tabelle B samt Suchparameter -> Funktioniert (Screenshot 1.Abfrage)
2. Abfrage zusätzlich mit Abfrage Tabelle C -> Alle Suchergebnisse aus der 1. Abfrage sind nicht mehr vorhanden, obwohl nur der Eintrag mit der Vermieter:_ID 2000005 wegfallen sollte ( (Screenshot 2.Abfrage / Historientabelle)

Kannst du mir erklären was ich genau falsch mache?
Schonmal Danke für dein Engagement!
 

Anhänge

  • 1.Abfrage.png
    1.Abfrage.png
    30,9 KB · Aufrufe: 4
  • 2.Abfrage.png
    2.Abfrage.png
    27,2 KB · Aufrufe: 4
  • Historientabelle.png
    Historientabelle.png
    10,7 KB · Aufrufe: 4
Könnte vllt. daran liegen das du die Werte hart eingetragen hast und deswegen IMMER das selbe Ergebnis bei der Bedingung rum kommt :)
Nämlich das es diese Kombination bereits gibt und deswegen wegfällt.

Probier es mal so:
Code:
Select Distinct b.vermieter_id,
                b.datei

From   vermieter b

Inner  Join mieter a
On     a.stadt = b.stadt
And    a.stadtteil = b.stadtteil
And    a.zimmeranzahl = b.zimmeranzahl
And    a.groesse = b.groesse
And    a.warmmieter = b.warmmiete
And    a.mietbeginn = b.mietbeginn

Where  Not Exists (Select 1
        From   mailhistorie c
        Where  c.mieter_id = a.mieter_id
        And    c.vermieter_id = b.vermieter_id)
Wenn du die Werte suchen willst BEVOR die Daten in deine Datenbank eingetragen sind, ist das aber eine andere Sache... Dann müsste man aber auch das Statement dafür anpassen :)

Wenn du nur einen bestimmten Mieter abfragen willst dann musst du ganz am Ende einfach nur das hinzufügen:
Code:
And    a.mieter_Id = '*DEINE_MIETER_ID*'
 
Werbung:
Hallo Distrilec,

ich hab es jetzt genau nach deiner Anleitung gemacht und es funktioniert prima.
Vielen lieben Dank für deine Hilfe und dein Engagement. Mein Problem ist gelöst und ich habe noch wieder viel dazugelernt.

Viele Grüße
awexb
 
Zurück
Oben