91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

sql中如何將full join改為left join +union all

發布時間:2021-05-20 09:58:52 來源:億速云 閱讀:219 作者:小新 欄目:數據庫

這篇文章主要介紹sql中如何將full join改為left join +union all,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

今天收到一個需求,要改寫一個報表的邏輯,當改完之后,再次運行,發現運行超時。

因為特殊原因,無法訪問客戶的服務器,沒辦法查看sql的執行計劃、沒辦法知道表中的索引情況,所以,嘗試從語句的改寫上來優化。

一、原始語句如下:

select isnull(vv.customer_id,v.customer_id) as customer_id,
		isnull(vv.business_date,replace(v.business_date,'-','')) as business_date,
		v.prod_id,
		v.sales,
		vv.visit_count,
    v.all_sales
from 
(
  SELECT a.customer_id ,
	    max(month)+'-01' as business_date,
      a.PROD_ID ,
      SUM(CAST(VALUE AS NUMERIC(38, 3))) sales,
      sum(SUM(CAST(VALUE AS NUMERIC(38, 3)))) over(partition by a.customer_id) as all_sales
							
  FROM  TB_IMPORT_SALES a 
  WHERE  a.customer_id IS NOT NULL
      AND a.PROD_ID IS NOT NULL
			and a.month='2016-11'
  GROUP BY a.customer_id ,
      a.PROD_ID
)v
full join
(
  SELECT customer_id, 
	    max(a.business_date) as business_date,
      COUNT(*) AS VISIT_COUNT 
	FROM TB_CALL_STORE a WITH(NOLOCK)
	inner join TB_TIME d
	on a.business_date = d.t_date 
	where d.section ='2016-11'
	GROUP BY customer_id
)vv
on v.customer_id = vv.customer_id

原來是left join,雖然查詢比較慢,但是2分鐘能查出來,現在按照業務要求,需要看到所有數據,所以改成了full join,改了之后5分鐘都查不出結果。

二、改寫后的代碼

select v.customer_id,
		replace(max(v.business_date),'-','') as business_date,
		v.prod_id,
		max(v.sales_volume) sales_volume ,
		max(v.visit_count) visit_count,
        max(v.all_sales_volume) all_sales_volume
from 
(
  SELECT a.customer_id ,
	    max(biz_month)+'-01' as business_date,
      a.PROD_ID ,
      SUM(CAST(VALUE1 AS NUMERIC(38, 8))) sales_volume,
      sum(SUM(CAST(VALUE1 AS NUMERIC(38, 8)))) over(partition by a.customer_id) as all_sales_volume,
			null as visit_count
							
  FROM  TB_IMPORT_SALES a 
  WHERE  a.customer_id IS NOT NULL
      AND a.PROD_ID IS NOT NULL
			and a.month='2016-11'
  GROUP BY a.customer_id ,
       a.PROD_ID
  union all
 
  SELECT customer_id, 
	    max(a.business_date) as business_date,
		  p.prod_id,
		  null,
		  null,
      COUNT(*) AS VISIT_COUNT 
	FROM TB_CALL_STORE a WITH(NOLOCK)
	cross apply
	(
		select top 1 prod_id from TB_PRODUCT with(nolock)
	)p
	inner join TB_TIME d
	on a.business_date = d.t_date 
	where d.section ='2016-11'
	GROUP BY customer_id,p.prod_id
)v
group by v.customer_id,
     v.prod_id

由于代碼本身比較簡單,沒辦法再進一步簡化,而由于連接不了服務器,其他的方法也用不上,甚至沒辦法分析到底是什么導致運行這么慢。

想了想,full join 本質上就是 2次left join+union ,無非就是合并數據,于是嘗試一下用union all來直接合并數據,現在改成unoin all最后,就不需要full join。

但是考慮到第2段代碼中并沒有prod_id這個字段,所以這里在第2段代碼加上了cross apply隨便取出一個產品的id,這樣就有prod_id這個字段,可以合并了。

修改之后,果然速度降到了10多秒。

以上是“sql中如何將full join改為left join +union all”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

靖宇县| 龙山县| 桂东县| 依兰县| 河曲县| 唐海县| 卓尼县| 汉寿县| 石狮市| 行唐县| 田东县| 东宁县| 舟曲县| 界首市| 同仁县| 霍林郭勒市| 西华县| 吴堡县| 灵武市| 新巴尔虎左旗| 昂仁县| 大宁县| 枣强县| 寻乌县| 宿州市| 杭锦旗| 灵石县| 和政县| 东平县| 苏州市| 博湖县| 米脂县| 烟台市| 奎屯市| 信阳市| 海淀区| 固原市| 锦州市| 黄平县| 扎赉特旗| 孝感市|