MySQL數據庫查詢:left join 或right join 加上where條件後連接失效,等同於inner join

有一個年都月份臨時表,一個 每月金額結果表,通過left join所希望的最終結果爲:每個月金額多少,如果這個沒有金額,則爲0。

月份臨時表:

SELECT DISTINCT bgbh,nd,yf FROM  SJQX.t_bg_yflsb WHERE BGBH = 'BG202004260001'

 金額結果表:

SELECT * FROM SJQX.T_BG_00003 T WHERE T.BGBH = 'BG202004260004';

通過LEFT JOIN 語句得到的結果爲:

SELECT 
			CASE WHEN T.ynse IS NULL THEN 0 ELSE T.ynse END AS ynse,
			CASE WHEN T.snse IS NULL THEN 0 ELSE T.snse END AS snse,
			T.yf as sj,T.nd,
			CASE WHEN T.sbfs IS NULL THEN '2' ELSE T.sbfs END AS sbfs
			
		FROM (
			SELECT  T1.ynse,T1.snse,T2.yf,T2.nd,T1.sbfs
			FROM 
				(SELECT DISTINCT bgbh,nd,yf FROM  SJQX.t_bg_yflsb WHERE BGBH = 'BG202004260001') t2
				LEFT   JOIN 
				SJQX.T_BG_00003  T1 ON    T1.sm = T2.yf and T1.nd =t2.nd
				WHERE  T1.BGBH = 'BG202004260004'  ) T ORDER BY nd,yf;

沒有得到如果在金額表裏匹配到得到金額數值,如果沒有匹配到則默認爲空展示0的效果。

原因:where是先連接然後再篩選 。

解決方法 :將where 換成and 即:

SELECT 
			CASE WHEN T.ynse IS NULL THEN 0 ELSE T.ynse END AS ynse,
			CASE WHEN T.snse IS NULL THEN 0 ELSE T.snse END AS snse,
			T.yf as sj,T.nd,
			CASE WHEN T.sbfs IS NULL THEN '2' ELSE T.sbfs END AS sbfs
			
		FROM (
			SELECT  T1.ynse,T1.snse,T2.yf,T2.nd,T1.sbfs
			FROM 
				(SELECT DISTINCT bgbh,nd,yf FROM  SJQX.t_bg_yflsb WHERE BGBH = 'BG202004260004') t2
				LEFT   JOIN 
				SJQX.T_BG_00003  T1 ON    T1.sm = T2.yf and T1.nd =t2.nd
				and (T1.BGBH = 'BG202004260004' ) ) T ORDER BY nd,yf;

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章