2016-07-14 15 views
0

Ich habe versucht, diese eine für eine Weile herauszufinden, aber nichts scheint für mich zu arbeiten und vielleicht ein bisschen Hilfe wird mir helfen, es besser zu verstehen. Ich schließe mich mehreren Tabellen an, möchte aber nur das maximale Datum, das mit einer ID-Nummer verknüpft ist. Es könnte mehrere Daten geben, die mit einer ID-Nummer verknüpft sind. Wenn ich das Stück MAX (Datum) herausnehme, wird es ausgeführt, aber gibt mehrere Datumswerte zurück. Ich möchte nicht, dass das MAX (Datum) in der ursprünglichen Auswahl, sondern nur in der WHERE-Klausel enthalten ist. Hier ist meine Frage:SQL - wo date = max date

SELECT DISTINCT A.ID , C.Date 
FROM IDTable A 
INNER JOIN AccountTable B 
    ON B.AccountID = A.AccountID 
FULL OUTER JOIN Updates U 
    ON U.ID = A.ID 
FULL OUTER JOIN Update2 C 
    ON C.AccountID = B.AccountID 
INNER JOIN UserTable UT 
    ON UT.UserMnemonicID = A.AssignedTo 
WHERE A.StatusID NOT IN ('Complete','Open') 
    --Need help here to only return MAX date value: 
    AND C.Date=(SELECT MAX(C.Date) FROM Update2) 
ORDER BY A.ID 
+0

Welche Art von SQL-Engine verwenden Sie? – William

Antwort

2

Wenn Sie die MAX (Datum) in der Anfangs Wählen Sie nicht wollen, dann würde dies funktionieren:

SELECT DISTINCT A.ID , C.Date 
FROM IDTable A 
INNER JOIN AccountTable B 
    ON B.AccountID = A.AccountID 
FULL OUTER JOIN Updates U 
    ON U.ID = A.ID 
FULL OUTER JOIN Update2 C 
    ON C.AccountID = B.AccountID 
INNER JOIN UserTable UT 
    ON UT.UserMnemonicID = A.AssignedTo 
WHERE A.StatusID NOT IN ('Complete','Open') 
    AND C.Date= 
    (SELECT MAX(C2.Date) 
    FROM Update2 C2 
    WHERE C2.AccountID = C.AccountID) 
ORDER BY A.ID 
+0

Das ist, was ich brauche. Die Abfrage gibt genau das zurück, wonach ich gesucht habe. Sieht so aus, als hätte ich der Unterabfragetabelle keinen Alias ​​zugewiesen. Danke – bojackh

+0

Cool, bitte akzeptieren Sie die Antwort. Vielen Dank. –

0

Ich glaube, Sie nur Aggregation wollen:

SELECT A.ID, MAX(C.Date) 
FROM IDTable A INNER JOIN 
    AccountTable B 
    ON B.AccountID = A.AccountID FULL OUTER JOIN 
    Updates U 
    ON U.ID = A.ID FULL OUTER JOIN 
    Update2 C 
    ON C.AccountID = B.AccountID INNER JOIN 
    UserTable UT 
    ON UT.UserMnemonicID = A.AssignedTo 
WHERE A.StatusID NOT IN ('Complete', 'Open') 
GROUP BY A.ID; 

Ich habe keine Ahnung, warum würden Sie FULL OUTER JOIN verwenden werden, viel weniger, warum Sie sie mit INNER JOIN Vermischen. Ich vermute, du willst wirklich LEFT JOIN.

+0

MAX (C.Date) in der ersten Auswahl funktioniert hier aber wollte die WHERE-Klausel Elemente in anderen Abfragen wo ich Count's tun würde. So hoffte ich herauszufinden, wie man den MAX (C.date) in die WHERE-Klausel bringt. Ich werde einen Blick auf die Verwendung von Left Join..tried Inner Join werfen, aber es wurden Werte weggelassen – bojackh

0

In SQL Server, verwenden ROWNUMBER ..

;with cte 
as 
(
SELECT A.ID , C.Date,row_number() over (partition by a.id order by c.date desc) as rn 
FROM IDTable A 
INNER JOIN AccountTable B 
    ON B.AccountID = A.AccountID 
FULL OUTER JOIN Updates U 
    ON U.ID = A.ID 
FULL OUTER JOIN Update2 C 
    ON C.AccountID = B.AccountID 
INNER JOIN UserTable UT 
    ON UT.UserMnemonicID = A.AssignedTo 
WHERE A.StatusID NOT IN ('Complete','Open') 
) 
select id,date from cte where rn=1 
0

mein nehmen hier. Bei komplexen Abfragen, gibt es immer mehrere Lösungen ...

Zuerst erhalten Sie das neueste Datum für jeden

AccountId
select AccountID, max(Date) 
from Update2 
group by AccountID 

Haften Sie diese in einer Unterabfrage, kommen zurück an den Tisch bekommen nur die „neuesten“ Eintrag

select CInner.*, CMax.MaxDate 
from Update2 CInner 
    inner join (-- Max date for every AccountID 
       select AccountID, max(Date) MaxDate 
       from Update2 
       group by AccountID) CMax 
    on CMax.AccountID = CInner.AccountID 
    and CMax.MaxDate = CInner.Date 

Schließen Sie dies an die ursprüngliche Abfrage an. machte es alle Unterabfrage die Full Outer so weit deutliche (I bewegt auch die innere schließt sich zusammen für Nachvollziehbarkeit)

SELECT DISTINCT A.ID , C.Date 
FROM IDTable A 
INNER JOIN AccountTable B 
    ON B.AccountID = A.AccountID 
INNER JOIN UserTable UT 
    ON UT.UserMnemonicID = A.AssignedTo 
FULL OUTER JOIN Updates U 
    ON U.ID = A.ID 
FULL OUTER JOIN (-- Update2, with latest date 
       select CInner.*, CMax.MaxDate 
        from Update2 CInner 
        inner join (-- Max date for every AccountID 
           select AccountID, max(Date) MaxDate 
           from Update2 
           group by AccountID) CMax 
        on CMax.AccountID = CInner.AccountID 
        and CMax.MaxDate = CInner.Date) C 
    ON C.AccountID = B.AccountID 
WHERE A.StatusID NOT IN ('Complete','Open') 
    --Need help here to only return MAX date value: 
    AND C.Date=(SELECT MAX(C.Date) FROM Update2) 
ORDER BY A.ID 

Dies ist Mitglied werden zu halten, wie ich gehen kann. Das Problem hierbei ist, dass alle JOINs vor der WHERE-Klausel aufgelöst werden, so dass in der aktuellen Form alle diese FULL OUTER JOINs sinnlos sind, da nur die resultierenden Zeilen mit dem Maximum (Date) enthalten sind.

Um zu erwähnen, finde ich Abfragen mit vollen äußeren Joins sehr schwierig, richtig zu bekommen. Die Tatsache, dass Sie zwei in Ihrer Anfrage haben, macht mir die Augen wässrig, und außerdem, wie sie von Ihren inneren Kernanfragen abzweigen. Sind Sie sicher, dass sie da sein müssen?

+0

Ja, Links Join scheint zu sein, was ich brauchte. Immer noch lernen/verstehen die Unterschiede zwischen den beiden. – bojackh