Wpis z mikrobloga

Spróbuj tak:

SELECT Pokoj.NrPokoju, MAX(Rezerwacja.DataDo)
FROM Pokoj
INNER JOIN Rezerwacja ON Pokoj.NrPokoju = Rezerwacja.NrPokoju
GROUP BY Pokoj.NrPokoju
ORDER BY MAX(Rezerwacja.DataDo)
@ceowwa: Bo nie potrafi wymagikować które DataOd byś chciał by się pojawiło. Ogólny termin z którym musisz się zapoznać to functional dependency a ten konkretny problem nazywa się groupwise maximum i pod tym hasłem szukaj, polecam rozwiązanie z LEFT JOINem.
@ceowwa: TO MS SQL, tak?
to możesz zamiast GROUP BY
dać podzapytanie skorelowane

SELECT Pokoj.NrPokoju, R.DataDo,R.DataOd
FROM Pokoj
INNER JOIN Rezerwacja R ON Pokoj.NrPokoju = R.NrPokoju
WHERE R.DataDo = (SELECT MAX(DataDo) FROM Rezerwacja WHERE Rezerwacja.NrPokoju = R.NrPokoju);
@plushy:tylko jeśli optymalizator sobie nie poradzi.

Ale ok.
SELECT Pokoj.NrPokoju, Rezerwacja.DataDo,Rezerwacja.DataOd
FROM Pokoj
INNER JOIN Rezerwacja ON Pokoj.NrPokoju = Rezerwacja.NrPokoju
INNER JOIN (SELECT NrPokoju, MAX(DataDo) AS MaxDataDo` FROM Rezerwacja GROUP BY NrPokoju) R
ON Rezerwacja.NrPokoju = R.NrPokoju AND Rezerwacja.DataDo = R.MaxDataDo;
@aardwolf: Nadal to nie jest moje ulubione.

SELECT Pokoj.NrPokoju, r1.DataDo, r1.DataOd
FROM Pokoj
INNER JOIN Rezerwacja r1 ON Pokoj.NrPokoju = r1.NrPokoju
LEFT JOIN rezerwacja r2 ON r1.NrPokoju = r2.NrPokoju AND r2.DataDo > r1.DataDo
WHERE r2.DataDo IS NULL
@plushy: dobre.
Jedyny problem takiego rozwiązania mógłby się pojawić gdyby w lewej tabeli LEFT JOINa istniały wiersze z NrPokoju równym NULL (co oczywiście jest niemożliwe w przypadku złączenia z tabelą Pokój), wtedy automatycznie wpadają one do wyniku.
@plushy: sprawdziłem rzeczywiste plany wykonania.
Zarówno podzapytanie skorelowane jak i złączenie z GROUP BY optymalizator traktuje tak samo i sprowadza tak naprawdę do sortowania.
Oba te równoznaczne rozwiązania są 2 razy wydajniejsze niż rozwiązanie z LEFT JOIN.