中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

沽源县| 岳池县| 枝江市| 密云县| 成武县| 辽中县| 凉山| 枞阳县| 灵石县| 义马市| 稻城县| 临汾市| 文水县| 谢通门县| 西平县| 宣化县| 任丘市| 策勒县| 招远市| 上杭县| 蓝山县| 元朗区| 福清市| 青海省| 大城县| 华坪县| 宁河县| 滨海县| 湄潭县| 景泰县| 西峡县| 台前县| 双牌县| 内江市| 万宁市| 惠水县| 定结县| 中西区| 巴中市| 宜昌市| 怀柔区|