簡體   English   中英

LEFT OUTER JOIN與條件在第三表中

[英]LEFT OUTER JOIN With Condition In Third Table

SQL小提琴在這里

精彩的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

SQL Fidle: http ://www.sqlfiddle.com/#!3 / 4a333/45

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM