2016-04-20 9 views
2

Es gibt Forschungsvorschläge. Entscheidungen werden über Vorschläge getroffen. Entscheidungen können nur von 4 Arten sein. Ich muss die letzte Entscheidung über alle überprüften Vorschläge, die mit einem bestimmten Forscher verbunden sind, anzeigen. Das ist, was ich habe, so weit:Brauchen Sie Hilfe beim Schreiben einer Abfrage (LINKE VERBINDUNG)

SELECT p.ProposalID 
    ,p.Title 
    ,p.DATE 
    ,p.Submitted 
    ,p.ReviewCompleted 
    ,d.DecisionID 
    ,dt.Description AS Decision 
FROM Proposal p 
LEFT JOIN (
    SELECT TOP 1 * 
    FROM Decision 
    ORDER BY DATE 
    ) d 
    ON d.ProposalID = p.ProposalID 
LEFT JOIN DecisionType dt 
    ON dt.DecisionTypeID = d.DecisionTypeID 
WHERE p.ReviewCompleted = '1' 
    AND p.ProposalID IN (
     SELECT ProposalID 
     FROM Proposal 
     WHERE ResearcherID = ? 
     ) 
ORDER BY d.DATE 

Ich verstehe, dass das Problem von dem ersten links kommt beitreten, aber ich kann nicht herausfinden, Gow onlt die neueste Entscheidung über p.ProposalID zu bekommen. Vielen Dank im Voraus.

+1

Wenn Sie die Fehlermeldung, die Sie erhalten, und vielleicht sogar die SQL für die Erstellung der Tabellen geben könnte, würde es bei der Fehlersuche für Sie helfen. Danke – AceWebDesign

+1

Zeigen Sie uns Beispieltabellendaten, das aktuelle falsche Ergebnis und das erwartete Ergebnis! – jarlh

+0

"Ich verstehe, dass das Problem von der ersten linken Verbindung kommt" - welches Problem? du hast es nie beschrieben. –

Antwort

1

Es scheint, dass Sie MSSQL verwenden (fügen Sie es Tags hinzu, wenn dies der Fall ist). In diesem Fall umschreiben JOIN diese LEFT mit ROW_NUMBER() function:

LEFT JOIN (
    SELECT TOP 1 * 
    FROM Decision 
    ORDER BY DATE 
    ) d 
    ON d.ProposalID = p.ProposalID 

zu

LEFT JOIN (
    SELECT Decision.*, 
    ROW_NUMBER() OVER(PARTITION BY ProposalID ORDER BY DATE DESC) AS Row_num 
    FROM Decision 
    ) d 
    ON (d.ProposalID = p.ProposalID) 
     AND (Row_num = 1) 

Hier müssen Sie die Zeilennummern für jede Gruppe und nach Datum geordnet berechnen. Wählen Sie dann zuerst für jede Gruppe zuerst (Row_num = 1) aus.

1

Sie können auch diese Abfrage schreiben OUTER APPLY mit:

FROM Proposal p OUTER APPLY 
    (SELECT TOP 1 * 
     FROM Decision d 
     WHERE d.ProposalID = p.ProposalID 
     ORDER BY DATE DESC 
    ) d LEFT JOIN 
    DecisionType dt 
    ON dt.DecisionTypeID = d.DecisionTypeID 

OUTER APPLY Implementierung eines SQL-Servers ist "lateral" eingeben. Manchmal haben Abfragen mit APPLY Leistungsvorteile.

+0

Sieht aus wie Alias ​​fehlt. 'FROM Entscheidung d' – Serg

+0

@serg. . . Vielen Dank. –

Verwandte Themen