Problème
In den folgenden beiden Tabellen möchte ich alle Kennungen für Beiträge auswählen, deren jüngster (d. h. letzter) Kommentar in der angegebenen Zeitspanne (z. B. Februar 2010) abgegeben wurde.
Das Ergebnis der Abfrage sollte nur die Beitrags-ID 1 zurückgeben, da der jüngste Kommentar für die Beitrags-ID 2 außerhalb des Bereichs des Zeitspannenfilters liegt.
Question
Ich habe die SELECT
Anweisung, die korrekt zu sein scheint und mit allen Testfällen zurechtkommt.
In dem Bestreben, meine SQL-Kenntnisse weiter zu verbessern, frage ich die Community, ob es eine "bessere" Methode für dieses Szenario gibt, Vorschläge zur Verbesserung der vorhandenen Anweisung und/oder Randfälle, die nicht abgedeckt sind.
Beachten Sie, dass dies eine lose Übersetzung der tatsächlichen Tabellen ist, die mit der Absicht geändert wurde, die Frage leichter verständlich zu machen. Ich verwende SQL Server 2005, was das betrifft.
Tische
Beitrag
Id Text Visible
1 Post 1 1
2 Post 2 1
3 Post 3 0
. ...
n Post n 1
Kommentar
Id Post_Id Text CommentNumber Timestamp
1 1 Comment 1, Post 1 1 2/3/2010
2 1 Comment 2, Post 1 2 2/4/2010
3 2 Comment 1, Post 2 1 3/1/2010
. . .
n m Comment n, Post m x xx/xx/xxxx
SQL-Befehl
SELECT [Id],[Text]
FROM [Post]
WHERE [Id] IN (
SELECT comment1.[Post_Id]
FROM (
SELECT max([CommentNumber]) as maxComment,
[Post_id]
FROM [Comment]
GROUP BY [Post_id]
) as comment2
INNER JOIN [Comment] as comment1 on comment1.[Post_id] = comment2.[Post_id]
WHERE comment1.[Timestamp] BETWEEN '2/1/2010 00:00:00.000' AND '2/28/2010 23:59:59.999'
AND comment1.[CommentNumber] = comment2.maxComment
)
AND [Post].[Visible] = 1
Bonusfrage
Ist es möglich, diese Abfrage mit NHiberate zu erstellen (entweder mit der Criteria API oder mit HQL)?