2016-07-14 13 views
0

私はしばらくこのことを理解しようとしていましたが、何も私にとってうまくいかないようです。私は複数のテーブルに参加していますが、ID番号に関連付けられている最大の日付のみが必要です。 ID番号には複数の日付が関連付けられている可能性があります。 MAX(Date)ピースを取り出すと、実行されますが複数の日付値が返されます。私は、MAX(日付)が最初の選択にあるのではなく、WHERE句内にあるだけです。ここに私のクエリです:あなたはFULL OUTER JOINを使用してなぜSQL - date = max date

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; 

私はあなたがINNER JOINとそれらを混合されるだろう、なぜそれほど、見当がつかない:

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

どのようなタイプの 'SQL'エンジンを使用していますか? – William

答えて

2

あなたが最初の選択でMAX(日付)したくない場合、これは動作します:

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

これは私が必要なものです。クエリは、私が探していたものを正確に返します。私はサブクエリテーブルにエイリアスを割り当てていないように見えます。ありがとう – bojackh

+0

クール、答えを受け入れてください。ありがとうございました。 –

0

私はあなただけの集計をしたいと思います。私はあなたが本当に望むと思うLEFT JOIN。 SQL Serverでの

+0

初期選択のMAX(C.Date)はここで動作しますが、WHERE句の項目を他のクエリで利用したいと思っていました。だから、WHERE句の中でMAX(C.date)をどうやって取得するのかを考えていた。私はLeft Join..tried Inner Joinを使用して見ていますが、それは値を残していました – bojackh

0

、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

ここに私のテイクがあります。複雑なクエリでは、複数のソリューションは、唯一の「最新の」GETに戻ってテーブルに参加し、サブクエリ内のすべてのアカウントID

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

の最新の日付スティックにこれを取得、

まず...常に存在していますエントリ

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 

これを元のクエリに戻します。 は完全外部これは私の知る限り行くことができるようである明確な (私もインナーが分かりのために一緒に参加して移動)

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 

に参加保つために、すべてのサブクエリをそれを作りました。ここで問題となるのは、すべてのJOINがWHERE句の前に解決されるため、現行のフォームではすべての外部結合が無意味で、max(Date)を含む結果行のみが含まれるためです。

言い換えると、完全な外部結合を持つクエリは、取得が非常に困難です。あなたの質問に2つのことがあるという事実は、私の目を水にし、あなたのコア・インナー・ジョイン・クエリーの「枝分かれ」するようにします。彼らがそこにいる必要があることは明確ですか?

+0

はい、左結合が必要なように見えます。まだ両者の違いを学んでいる/理解している。 – bojackh