[英]LEFT OUTER JOIN With Condition In Third Table
精彩的SQL作家,
我試圖獲取某個范圍內的所有日期(存儲為T1中的記錄),以及相關表(T2)中記錄值的總和。 但是,T2中的某些記錄將被第三個表(T3)中的字段值過濾掉。
假設這樣的表:
TABLE T1
| MonthYearKey |
|==============|
| 201401 |
| 201402 |
| 201403 |
| 201404 |
| 201405 |
| 201406 |
TABLE T2
| MonthYearKey | NextKey | MyValue |
|==============+=========+=========|
| 201402 | 6 | 10 |
| 201403 | 6 | 10 |
| 201404 | 6 | 10 |
| 201402 | 8 | 10 |
| 201403 | 8 | 10 |
| 201404 | 8 | 10 |
| 201401 | 10 | 10 |
| 201402 | 10 | 10 |
| 201406 | 10 | 10 |
TABLE T3
| NextKey | IsValid |
|=========+=========|
| 6 | 1 |
| 8 | 1 |
| 10 | 0 |
我正在運行的SQL是:
SELECT T1.MonthYearKey, SUM(ISNULL(T2.MyValue, 0)) AS SumOfValues
FROM T1
LEFT OUTER JOIN T2 ON T1.MonthYearKey = T2.MonthYearKey
LEFT OUTER JOIN T3 ON T2.NextKey = T3.NextKey
WHERE ISNULL(T3.IsValid, 1) = 1
GROUP BY T1.MonthYearKey
我期望的輸出是:
| MonthYearKey | SumOfValues |
|==============+=============|
| 201401 | 0 |
| 201402 | 20 |
| 201403 | 20 |
| 201404 | 20 |
| 201405 | 0 |
| 201406 | 0 |
但是,正如您在SQL Fiddle中看到的那樣,201401和201406個月完全退出了結果。 我假設這是因為它選擇了NextKey = 10的記錄,然后由IsValid = 0過濾掉。
問題:如何獲得所有MonthYearKeys,甚至是那些當前在我的SQL中被過濾掉的那些?
在where
子句中應用過濾器時,會丟失行 - 包括用於group by
的列。
相反,使用條件聚合:
SELECT T1.MonthYearKey,
COALESCE(SUM(case when t3.isvalid is null or t3.isvalid = 1
then T2.MyValue
end), 0
) as SumOfValues
FROM T1 LEFT OUTER JOIN
T2
ON T1.MonthYearKey = T2.MonthYearKey LEFT OUTER JOIN T3
ON T2.NextKey = T3.NextKey
GROUP BY T1.MonthYearKey;
嘗試這個:
SELECT T1.MonthYearKey, SUM(ISNULL(T2.MyValue, 0)) AS SumOfValues
FROM T1
LEFT OUTER JOIN (
SELECT T2.MyValue, T2.MonthYearKey
FROM T2
JOIN T3 ON T2.NextKey = T3.NextKey AND ISNULL(T3.IsValid, 1) = 1
) T2 ON T1.MonthYearKey = T2.MonthYearKey
GROUP BY T1.MonthYearKey
試試這里: http : //www.sqlfiddle.com/#!3/4a333/26
編輯 :
沒有嵌套查詢:
SELECT T1.MonthYearKey, SUM(ISNULL(T2.MyValue, 0)) AS SumOfValues
FROM T2
JOIN T3 ON T2.NextKey = T3.NextKey AND T3.IsValid = 1
RIGHT OUTER JOIN T1 ON T1.MonthYearKey = T2.MonthYearKey
GROUP BY T1.MonthYearKey
通過更改JOIN
優先級而不使用嵌套查詢:
SELECT T1.MonthYearKey, SUM(ISNULL(T2.MyValue, 0)) AS SumOfValues
FROM T1
LEFT OUTER JOIN (T2 JOIN T3 ON T2.NextKey = T3.NextKey AND T3.IsValid = 1)
ON T1.MonthYearKey = T2.MonthYearKey
GROUP BY T1.MonthYearKey
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.