亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

大方县| 彝良县| 白水县| 大足县| 淮安市| 贡嘎县| 海宁市| 个旧市| 娱乐| 屏东县| 新绛县| 西乌珠穆沁旗| 河北省| 兖州市| 新建县| 安泽县| 铜川市| 资兴市| 东港市| 泰来县| 万州区| 建湖县| 安泽县| 巴东县| 昌黎县| 章丘市| 镇原县| 东明县| 丹江口市| 沈阳市| 武汉市| 乌恰县| 酉阳| 通辽市| 上蔡县| 韶关市| 西吉县| 晋城| 静乐县| 桐柏县| 高淳县|