Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Datenbanbkabfrage über 3 Tabellen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von awexb, 7 April 2015.

  1. awexb

    awexb Benutzer

    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.
     
  2. Distrilec

    Distrilec Datenbank-Guru

    Was steht in Tabelle A, was steht in Tabelle B und was steht in Tabelle C.... Vorher kann ich nichts machen?
     
  3. awexb

    awexb Benutzer

    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:

  4. Distrilec

    Distrilec Datenbank-Guru

    Also gut... Schritt 1 hätten wir.
    Nun zu Schritt 2:
    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...
     
  5. awexb

    awexb Benutzer

    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.
     
  6. Distrilec

    Distrilec Datenbank-Guru

    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)
     
  7. awexb

    awexb Benutzer

    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:

  8. Distrilec

    Distrilec Datenbank-Guru

    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*'
     
  9. awexb

    awexb Benutzer

    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden