SQL Fiddle HereLEFT OUTER JOIN Với Điều kiện Trong bảng thứ ba
Writers SQL Brilliant,
tôi đang cố gắng để có được tất cả các ngày trong một phạm vi nhất định (lưu dưới dạng các bản ghi trong T1), và tổng các giá trị các bản ghi trong bảng liên quan (T2). Tuy nhiên, một số bản ghi trong T2 sẽ được lọc ra theo giá trị của một trường trong bảng thứ ba (T3).
bảng Giả sử như thế này:
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 Tôi đang chạy là:
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
Kết quả mong đợi của tôi là:
| MonthYearKey | SumOfValues |
|==============+=============|
| 201401 | 0 |
| 201402 | 20 |
| 201403 | 20 |
| 201404 | 20 |
| 201405 | 0 |
| 201406 | 0 |
Tuy nhiên, như bạn có thể nhìn thấy trong SQL Fiddle, các tháng 201401 và 201406 được loại bỏ hoàn toàn khỏi kết quả. Tôi giả định này là bởi vì nó được lựa chọn các hồ sơ với NextKey = 10, sau đó được lọc ra bởi IsValid = 0.
HỎI: Làm thế nào tôi có thể nhận được TẤT CẢ các MonthYearKeys, ngay cả những người hiện đang được lọc ra trong SQL của tôi?
Tôi thấy rằng bạn sử dụng các chức năng liên hiệp để đảm bảo rằng tất cả các tháng có giá trị bằng không nếu họ không có kết quả. Tại sao bạn chọn COALESCE thay vì ISNULL (trước đây tôi chưa sử dụng COALESCE)? COALESCE có bất kỳ hàm ý hiệu suất nào vì nó được đánh giá nhiều lần hay các hệ lụy đáng tin cậy do kết quả có thể thay đổi (xem http://msdn.microsoft.com/en-us/library/ms190349.aspx) – laughsloudly
Tôi thích 'coalesce()' bởi vì nó là hàm chuẩn ANSI. Tuy nhiên, 'isnull()' thường được ưa thích trong SQL Server, bởi vì (theo ý kiến của tôi) SQL Server có một sự thực thi bị hỏng của 'coalesce()'. Vì vậy, hãy sử dụng một trong hai. –