SQL Server: join abgeleitete Tabelle mit der Klausel?
Ich würde gerne mitmachen, die auf einer Unterabfrage /abgeleitete Tabelle, die enthält eine WITH-Klausel (die Klausel ist notwendig, um filter auf ROW_NUMBER() = 1
). In Teradata-etwas ähnliches würde funktionieren, aber Teradata verwendet QUALIFY ROW_NUMBER() = 1
statt einer Ziffer.
Hier ist mein Versuch an dieser join:
-- want to join row with max StartDate on JobModelID
INNER JOIN (
WITH AllRuns AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY JobModelID ORDER BY StartDate DESC) AS RowNumber
FROM Runs
)
SELECT * FROM AllRuns WHERE RowNumber = 1
) Runs
ON JobModels.JobModelID = Runs.JobModelID
Was mache ich falsch?
InformationsquelleAutor jnylen | 2010-04-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hinzufügen einer join-Bedingung ist wahrscheinlich weniger effizient, aber in der Regel funktioniert gut für mich.
Haben Sie jeden Versuch zu Profil diese Abfrage? Ausführungspläne, Profiler, Client-Statistik?
Ich Stimme mit astander. Meine Faustregel: wenn die Abfrage kommt wieder in einer angemessenen Höhe der Zeit, es ist ok. Wenn nicht, fange ich mit der Suche nach hotspots und versuchen zu überarbeiten. Ich hatte noch nie refactor-code wie das, was ich schon oben gezeigt.
Ich habe nicht genug Daten, wo es wäre die Sache doch (noch in Entwicklungsphase). Die Menge der Daten, die wahrscheinlich bleiben ziemlich klein, wie auch immer, ich war gerade auf der Suche nach etwas subjektiv.
InformationsquelleAutor bernie
Könnten Sie mehrere Ziffern. So etwas wie
Für weitere Einzelheiten über die Verwendungen/Struktur/Regeln siehe Unter WITH common_table_expression (Transact-SQL)
(SELECT * FROM AllRuns WHERE RowNumber = 1)
.Ich würde disaggree auf die Tatsache, dass mehrere sattements in einer with-Klausel ist HÄSSLICH. Es ist etwas anders sintac auf mehrere layered sub wählt, welche in den meisten Fällen macht es extrem schwer zu Lesen.
Ich meine, hässlich in dem Sinne, dass das SQL für die Durchführung der Unterabfrage ' s Aufgabe (Filterung der
Runs
Tabelle um eine Zeile proJobModelID
) ist nun aufgeteilt zwischen dem Beginn der Abfrage und der Unterabfrage.InformationsquelleAutor Adriaan Stander