|
|
select zimmernummer from reservierungen
where anreisedatum<=Abreise
and abreisedatum>=Anreise
and status != "2"
group by zimmernummer;
select zimmernummer from zimmer
where zimmernummer not in (ergebnis aus abfrage 1);
|
|
select distinct z.zimmernummer
from zimmer z
inner join reservierungen r
on r.zimmernummer = z.zimmernummer
and r.abreisedatum >= :anreise
and r.anreisedatum <= :abreise
select zimmernummer
from zimmer
where zimmernummer not in (
select zimmernummer
from reservierungen
where anreisedatum <= :abreise
and abreisedatum >= :anreise
)
select z.zimmernummer
from zimmer z
left join reservierungen r
on r.zimmernummer = z.zimmernummer
and r.abreisedatum >= :anreise
and r.anreisedatum <= :abreise
group by z.zimmernummer
having count(r.zimmernummer) = 0
|
|
|
Die Zeitraumangabe kann auch in der Where-Klausel stehen (in MSSQL).
– Floyd 22.09.2009
|
||
| 2 |
Rein syntaktisch kann sie das. Aber wenn die Zeitraumangabe in der Where-Klausel steht, dann macht das den OUTER JOIN zunichte! Für den Fall das es ein Zimmer ohne Reservierung gibt und damit der OUTER JOIN auf r.zimmernummer = z.zimmernummer greift, sind r.abreisedatum und r.anreisedatum NULL. Ein Vergleich in der Where-Klausel führt dann zum Ausschluß des Datensatzes und eliminiert damit den OUTER JOIN. Und das sollte auch beim MSSQL so sein.
– FalkP 22.09.2009
|
|
|
|
Hierzu muß der LEFT JOIN aber anders formuliert werden, da sonst Zimmer die überhaupt KEINE Reservierung haben niemals als Frei gezählt werden. Also entweder ein zstzl. OR r.zimmernummer IS NULL (mit passender Klammerung natürlich) oder die Bedingungen in den ON-Teil der JOIN-Definition und nicht in die WHERE-Klausel.
– FalkP 21.09.2009
|
||
|
OK, mein erster Kommentar ist quatsch, da dieser JOIN nicht die freien, sondern die belegten Zimmer findet. Für diesen Fall ist der LEFT JOIN jedoch unsinnig, hier würde ein INNER JOIN reichen.
– FalkP 21.09.2009
|
||
|
So ganz falsch ist der erste Kommentar von FalkP nicht: Der Join aus der Antwort ist falsch. Statt "WHERE" muss es "AND" heißen und es bedarf noch ein "WHERE r.zimmernzimmer IS NULL". Da ist die Antwort von cyper doch besser lesbar.
– BeachBlocker 21.09.2009
|
||
|
Einen Inner Join halte ich für unsinnig, da der die Ergebnistabelle kleiner macht als sie sein soll, da er tatsächlich nur Zimmer liefert, für die Reservierungen vorhanden sind.
Der Left Join enthält alle Zimmer die nicht, oder nicht zu diesem Zeitraum reserviert sind. Bei gar nicht reservierten bleiben Spalten leer, da nur die Zimmernummer abgefragt wird ist das egal. Ich halte einen Join für besser, weil dadurch nur eine query nötig ist. Warum das WHERE ein AND sein sollte leuchtet mir nicht ein, den Bestandteil des Joins ist es nicht. – huckepick 21.09.2009
|
||
|
das "on z.zimmernummer=r.zimmernumme AND anreisedatum<=Abreise AND abreisedatum>=Anreise AND status != '2'" sorgt dafür, dass die Bedingung vor und nicht nach dem join augewertet wird. Es werden nur die Reservierung gejoined, die der Bedingung entsprechen und nicht alle Reservierungen und dann erst das where ausgewertet. Beispiele
Zimmer Reservisungen/Status Ergebnis WHERE/AND 1 keine gleich 2 nur außerhalb des Zeitraums unterschiedlich 3 nur innerhalb des Zeitraums gleich 3 innerhalb und außerhalb gleich – BeachBlocker 21.09.2009
|