2016-07-14 57 views
0

我一直在試圖找出一段時間,但似乎沒有任何工作對我來說,也許一點幫助將幫助我更好地理解它。我加入了多個表格,但只需要與ID號碼關聯的最大日期。可能有多個與ID號碼關聯的日期。如果我取出MAX(日期)部分,它將運行但返回多個日期值。我不希望MAX(日)至但僅限於在WHERE子句在最初的選擇。這裏是我的查詢:SQL - 其中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

你正在使用什麼類型的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

我覺得你只是想聚集:

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; 

我不知道爲什麼你會使用FULL OUTER JOIN,更不用說你爲什麼會用INNER JOIN可以將它們混合。我懷疑你真的想要LEFT JOIN

+0

MAX(C.Date)在最初的選擇工作在這裏,但想要利用其他查詢中的WHERE子句項,我會做Count的。因此,希望能弄清楚如何在WHERE子句中獲得MAX(C.date)。我會看看使用左加入..嘗試內部加入,但它是遺漏值 – bojackh

0

在SQL Server,使用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

這是我服用。對於複雜的查詢,總是有多種解決方案...

首先,獲取每一個最新的日期ACCOUNTID

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)的結果行纔會包含在內。

要提到的是,我發現全外連接的查詢非常難以正確。事實上,在查詢中有兩個讓我的眼睛流水,更重要的是它們可以「分離」核心內部連接查詢。你確定他們需要在那裏嗎?

+0

是的,左連接似乎是我需要的。仍然在學習/理解兩者之間的差異。 – bojackh