Frage

Ich möchte auf einer Unterabfrage / abgeleitete Tabelle verbinden, die ein WITH-Klausel enthält (die WITH-Klausel ist notwendig, um Filter auf ROW_NUMBER() = 1). In Teradata etwas Ähnliches würde gut funktionieren, aber Teradata Anwendungen QUALIFY ROW_NUMBER() = 1 statt einer WITH-Klausel.

Hier ist mein Versuch, diese 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?

War es hilfreich?

Lösung

Hinzufügen einer Join-Bedingung wahrscheinlich weniger effizient ist, aber in der Regel funktioniert gut für mich.

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

Andere Tipps

Sie könnten mehr MIT Klauseln verwenden. So etwas wie

;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 

Für weitere Einzelheiten über die Verbräuche / Struktur / Regeln finden Sie unter MIT common_table_expression (Transact -SQL)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top