SQL Server: rejoignez sur la table dérivée qui contient la clause WITH?
-
30-09-2019 - |
Question
Je voudrais rejoindre un sous-requête / table dérivée qui contient une clause WITH (la clause WITH est nécessaire de filtrer sur ROW_NUMBER() = 1
). Dans Teradata quelque chose de similaire fonctionnerait très bien, mais Teradata usages QUALIFY ROW_NUMBER() = 1
au lieu d'une clause WITH.
Voici ma tentative de cette jointure:
-- 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
Qu'est-ce que je fais mal?
La solution
Ajout d'une condition de jointure est probablement moins efficace, mais fonctionne généralement bien pour moi.
INNER JOIN (
SELECT *,
ROW_NUMBER() OVER
(PARTITION BY JobModelID
ORDER BY StartDate DESC) AS RowNumber
FROM Runs
) Runs
ON JobModels.JobModelID = Runs.JobModelID
AND Runs.RowNumber = 1
Autres conseils
Vous pouvez utiliser plusieurs clauses WITH. Quelque chose comme
;WITH AllRuns AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY JobModelID ORDER BY StartDate DESC) AS RowNumber
FROM Runs
),
Runs AS(
SELECT *
FROM AllRuns
WHERE RowNumber = 1
)
SELECT *
FROM ... INNER JOIN (
Runs ON JobModels.JobModelID = Runs.JobModelID
Pour plus de détails sur les usages / structure / règles voir AVEC common_table_expression (Transact -SQL)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow