Announcement

Collapse
No announcement yet.

SQL-Problem mit Abfrage (LEFT JOIN...)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL-Problem mit Abfrage (LEFT JOIN...)

    Ich habe ein Problem bei einer Abfrage, doch zunächst die Ausgangssituation:

    Thema: Zimmerreservierung
    2 Tabellen: "Zimmer" und "Reservierungen"


    Zimmer enthält z.B. ZimmerID (PK, Fremdschlüssel in Reservierungen) Zimmerart, .... und Reservierungen enthält ReservierungsID, ZimmerID (s.o.), Buchungsbeginn, Buchungsende


    Gegeben seien ein Anfangs- und Enddatum. Ich möchte nun alle Zimmer ausgeben, die in diesem Zeitraum NICHT reserviert sind, sprich frei sind.

    Folgendes habe ich derzeit:


    Code:
    SELECT DISTINCT z.zimmerID, z.art FROM zimmer z
    
    LEFT JOIN reservierungen r ON (z.zimmerID = r.zimmerID) WHERE ((r.reservID IS null)
    
    OR (([Anreisedatum] >= reservEnd) OR ([Abreisedatum] <= reservAnf))) AND ("Doppelzimmer" = z.art)
    "reservID IS null" -> damit die Zimmer ausgegeben werden, die niemals gebucht wurden, also zwingend frei sind.



    Das ganze klappt nicht, es werden auch die Zimmer ausgegeben, die eigentlich schon reserviert sind.

    Ich denke das hat mit dem JOIN zu tun, da in der virtuellen Tabelle 1 Zimmer nicht zwingend nur 1x vorkommt. ich müsste ihm also klarmachen, dass der Abgleich des An-/Abreisedatums niemals negativ ausfallen darf, auch nicht bei einem der mehreren Datensätze zum jeweiligen Zimmer.


    Kann ich das Problem anders lösen? Evtl. mit einem Subselect? Bitte um Hilfe, da ich verzweifle

  • #2
    Hallo,

    Dein Ansatz ist gar nicht schlecht, allerdings muss man immer die Reihenfolge der Abarbeitung einer SQL-Abfrage beachten. So wird immer zuerst der FROM-Abschnitt incl. der JOINS und dann erst der WHERE-Abschnitt verarbeitet. Mit einer kleinen Umformulierung sollte es also klappen:
    Code:
    SELECT DISTINCT z.zimmerID, z.art 
    FROM zimmer z
    	LEFT JOIN reservierungen r ON (z.zimmerID = r.zimmerID) 
    		AND (([Anreisedatum] >= reservAnf) AND ([Anreisedatum] < reservEnd) 
    		OR ([Abreisedatum] > reservAnf) AND ([Abreisedatum] <= reservEnd))
    WHERE 
    	(r.reservID IS null) AND ("Doppelzimmer" = z.art)
    Du schaust also auf die Reservierungen bei denen der Anreise- oder Abreisetag zwischen Anf und End der Reservierungen liegt. Diese willst Du dann nicht haben (...IS NULL).
    Ich konnte es jetzt nicht auf die Schnelle mit Daten nachvollziehen, aber ich hoffe das klappt.

    Gruß
    Olaf

    Comment


    • #3
      danke für die hilfe, das reicht mir erstmal.

      werde mich bei bedarf melden

      Comment

      Working...
      X