请看一下这种SQL语句如何优化。

chi742658817 2017-11-29 02:06:12
SELECT ST_ITEM,
ST_VER,
DECODE(ST_CFMMAN, '', 'NO', 'YES') AS ST_CFMMAN,
DECODE(ST_TRMAN, '', 'NO', 'YES') AS ST_TRMAN,
DECODE((SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'IQC'),'','——',(SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'IQC')) AS IQC,
DECODE((SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'ZC-PD'),'','——',(SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'ZC-PD')) AS ZCPD,
DECODE((SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'SMT-PD'),'','——',(SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'SMT-PD')) AS SMTPD,
DECODE((SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'SMT-CS'),'','——',(SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'SMT-CS')) AS SMTC,
DECODE((SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'SMT-SS'),'','——',(SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'SMT-SS')) AS SMTS,
DECODE((SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'AIM'),'','——',(SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'AIM')) AS AIM,
DECODE((SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'INSERT'),'','——',(SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'INSERT')) AS INSERTS,
DECODE((SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'REPAIR'),'','——',(SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'REPAIR')) AS REPAIRS,
DECODE((SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'VIEWICT'),'','——',(SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'VIEWICT')) AS VIEWICT,
DECODE((SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'FCMCCHK'),'','——',(SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'FCMCCHK')) AS FCMCCHK,
DECODE((SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'ASSY'),'','——',(SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'ASSY')) AS ASSY,
DECODE((SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'FINALCHK'),'','——',(SELECT SUM(STS_TS)FROM STTS WHERE STS_ITEM = ST_ITEM AND STS_VER = ST_VER AND STS_WS = 'FINALCHK')) AS FINALCHK
FROM STT LEFT JOIN STTS ON ST_ITEM = STS_ITEM AND ST_VER = STS_VER
GROUP BY ST_ITEM, ST_VER, ST_CFMMAN, ST_TRMAN
ORDER BY ST_ITEM, ST_VER;


中间的DECODE需要sum合计数据,所以在里面查了一遍,AS 又不行,
所以不为空时这样的内查询sql又重复了一遍,
AS又不行,请高手看下怎么能优化一下,短一点也好...
...全文
275 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
碧水幽幽泉 2017-11-29
  • 打赏
  • 举报
回复
引用 8 楼 chi742658817 的回复:
[quote=引用 7 楼 qq646748739 的回复:]
你的语句太长了,行不通,极大地影响了性能。
做数据库这一行,性能远远比(查询)结果重要。

报了无效数字错误......
额,我不是专做数据库的,是搞开发的,数据库方面的能力,
只限在基本的增删改查
深入点的优化能力就不行了,想学习也不知道从何学起才能加深这方面的能力,
只能靠慢慢积累....遇到一次问题就记一次解决方式...[/quote]
无效数字,是因为STS_TS中还有包含字符串的情况,这个就需要你自己去排查了。
chi742658817 2017-11-29
  • 打赏
  • 举报
回复
引用 7 楼 qq646748739 的回复:
你的语句太长了,行不通,极大地影响了性能。 做数据库这一行,性能远远比(查询)结果重要。
报了无效数字错误...... 额,我不是专做数据库的,是搞开发的,数据库方面的能力, 只限在基本的增删改查, 深入点的优化能力就不行了,想学习也不知道从何学起才能加深这方面的能力, 只能靠慢慢积累....遇到一次问题就记一次解决方式...
碧水幽幽泉 2017-11-29
  • 打赏
  • 举报
回复
你的语句太长了,行不通,极大地影响了性能。
做数据库这一行,性能远远比(查询)结果重要。
碧水幽幽泉 2017-11-29
  • 打赏
  • 举报
回复
我把DECODE敲成DEOCDE了,你用下面的语句不行?

SELECT ST_ITEM,
ST_VER,
DECODE(ST_CFMMAN, '', 'NO', 'YES') AS ST_CFMMAN,
DECODE(ST_TRMAN, '', 'NO', 'YES') AS ST_TRMAN,
NVL(SUM(DECODE(TS_WS,'IQC',STS_TS,0)),'——') AS IQC,
NVL(SUM(DECODE(TS_WS,'ZC-PD',STS_TS,0)),'——') AS ZCPD,
NVL(SUM(DECODE(TS_WS,'SMT-PD',STS_TS,0)),'——') AS SMTPD,
NVL(SUM(DECODE(TS_WS,'SMT-CS',STS_TS,0)),'——') AS SMTCS,
NVL(SUM(DECODE(TS_WS,'SMT-SS',STS_TS,0)),'——') AS SMTSS,
NVL(SUM(DECODE(TS_WS,'AIM',STS_TS,0)),'——') AS AIM,
NVL(SUM(DECODE(TS_WS,'INSERT',STS_TS,0)),'——') AS INSERT,
NVL(SUM(DECODE(TS_WS,'REPAIR',STS_TS,0)),'——') AS REPAIR,
NVL(SUM(DECODE(TS_WS,'VIEWICT',STS_TS,0)),'——') AS VIEWICT,
NVL(SUM(DECODE(TS_WS,'FCMCCHK',STS_TS,0)),'——') AS FCMCCHK,
NVL(SUM(DECODE(TS_WS,'ASSY',STS_TS,0)),'——') AS ASSY,
NVL(SUM(DECODE(TS_WS,'FINALCHK',STS_TS,0)),'——') AS FINALCHK
FROM STT
LEFT JOIN STTS ON ST_ITEM = STS_ITEM
AND ST_VER = STS_VER
GROUP BY ST_ITEM, ST_VER, ST_CFMMAN, ST_TRMAN
ORDER BY ST_ITEM, ST_VER;
chi742658817 2017-11-29
  • 打赏
  • 举报
回复
引用 3 楼 qq646748739 的回复:
ST_CFMMAN和ST_TRMAN可以不用改成CASE WHEN
		
SELECT ST_ITEM,
ST_VER,
DECODE(ST_CFMMAN, '', 'NO', 'YES') AS ST_CFMMAN,
DECODE(ST_TRMAN, '', 'NO', 'YES') AS ST_TRMAN,
NVL(SUM(DEOCDE(TS_WS,'IQC',STS_TS,0)),'——') AS IQC,
NVL(SUM(DEOCDE(TS_WS,'ZC-PD',STS_TS,0)),'——') AS ZCPD,
NVL(SUM(DEOCDE(TS_WS,'SMT-PD',STS_TS,0)),'——') AS SMTPD,
NVL(SUM(DEOCDE(TS_WS,'SMT-CS',STS_TS,0)),'——') AS SMTCS,
NVL(SUM(DEOCDE(TS_WS,'SMT-SS',STS_TS,0)),'——') AS SMTSS,
NVL(SUM(DEOCDE(TS_WS,'AIM',STS_TS,0)),'——') AS AIM,
NVL(SUM(DEOCDE(TS_WS,'INSERT',STS_TS,0)),'——') AS INSERT,
NVL(SUM(DEOCDE(TS_WS,'REPAIR',STS_TS,0)),'——') AS REPAIR,
NVL(SUM(DEOCDE(TS_WS,'VIEWICT',STS_TS,0)),'——') AS VIEWICT,
NVL(SUM(DEOCDE(TS_WS,'FCMCCHK',STS_TS,0)),'——') AS FCMCCHK,
NVL(SUM(DEOCDE(TS_WS,'ASSY',STS_TS,0)),'——') AS ASSY,
NVL(SUM(DEOCDE(TS_WS,'FINALCHK',STS_TS,0)),'——') AS FINALCHK
FROM STT
LEFT JOIN STTS ON ST_ITEM = STS_ITEM
AND ST_VER = STS_VER
GROUP BY ST_ITEM, ST_VER, ST_CFMMAN, ST_TRMAN
ORDER BY ST_ITEM, ST_VER;

原始数据这样的:

修改后是这样:

效果实现了,就是SQL语句太长....
chi742658817 2017-11-29
  • 打赏
  • 举报
回复
引用 3 楼 qq646748739 的回复:
ST_CFMMAN和ST_TRMAN可以不用改成CASE WHEN
		
 SELECT ST_ITEM,
		ST_VER,
		DECODE(ST_CFMMAN, '', 'NO', 'YES') AS ST_CFMMAN,
        DECODE(ST_TRMAN, '', 'NO', 'YES') AS ST_TRMAN,
		NVL(SUM(DEOCDE(TS_WS,'IQC',STS_TS,0)),'——') AS IQC,
		NVL(SUM(DEOCDE(TS_WS,'ZC-PD',STS_TS,0)),'——') AS ZCPD,
		NVL(SUM(DEOCDE(TS_WS,'SMT-PD',STS_TS,0)),'——') AS SMTPD,
		NVL(SUM(DEOCDE(TS_WS,'SMT-CS',STS_TS,0)),'——') AS SMTCS,
		NVL(SUM(DEOCDE(TS_WS,'SMT-SS',STS_TS,0)),'——') AS SMTSS,
		NVL(SUM(DEOCDE(TS_WS,'AIM',STS_TS,0)),'——') AS AIM,
		NVL(SUM(DEOCDE(TS_WS,'INSERT',STS_TS,0)),'——') AS INSERT,
		NVL(SUM(DEOCDE(TS_WS,'REPAIR',STS_TS,0)),'——') AS REPAIR,
		NVL(SUM(DEOCDE(TS_WS,'VIEWICT',STS_TS,0)),'——') AS VIEWICT,
		NVL(SUM(DEOCDE(TS_WS,'FCMCCHK',STS_TS,0)),'——') AS FCMCCHK,
		NVL(SUM(DEOCDE(TS_WS,'ASSY',STS_TS,0)),'——') AS ASSY,
		NVL(SUM(DEOCDE(TS_WS,'FINALCHK',STS_TS,0)),'——') AS FINALCHK
   FROM STT  
   LEFT JOIN STTS ON ST_ITEM = STS_ITEM  
    AND ST_VER = STS_VER
  GROUP BY ST_ITEM, ST_VER, ST_CFMMAN, ST_TRMAN
  ORDER BY ST_ITEM, ST_VER;
不行,报DEOCDE标识符无效....
碧水幽幽泉 2017-11-29
  • 打赏
  • 举报
回复
ST_CFMMAN和ST_TRMAN可以不用改成CASE WHEN
		
SELECT ST_ITEM,
ST_VER,
DECODE(ST_CFMMAN, '', 'NO', 'YES') AS ST_CFMMAN,
DECODE(ST_TRMAN, '', 'NO', 'YES') AS ST_TRMAN,
NVL(SUM(DEOCDE(TS_WS,'IQC',STS_TS,0)),'——') AS IQC,
NVL(SUM(DEOCDE(TS_WS,'ZC-PD',STS_TS,0)),'——') AS ZCPD,
NVL(SUM(DEOCDE(TS_WS,'SMT-PD',STS_TS,0)),'——') AS SMTPD,
NVL(SUM(DEOCDE(TS_WS,'SMT-CS',STS_TS,0)),'——') AS SMTCS,
NVL(SUM(DEOCDE(TS_WS,'SMT-SS',STS_TS,0)),'——') AS SMTSS,
NVL(SUM(DEOCDE(TS_WS,'AIM',STS_TS,0)),'——') AS AIM,
NVL(SUM(DEOCDE(TS_WS,'INSERT',STS_TS,0)),'——') AS INSERT,
NVL(SUM(DEOCDE(TS_WS,'REPAIR',STS_TS,0)),'——') AS REPAIR,
NVL(SUM(DEOCDE(TS_WS,'VIEWICT',STS_TS,0)),'——') AS VIEWICT,
NVL(SUM(DEOCDE(TS_WS,'FCMCCHK',STS_TS,0)),'——') AS FCMCCHK,
NVL(SUM(DEOCDE(TS_WS,'ASSY',STS_TS,0)),'——') AS ASSY,
NVL(SUM(DEOCDE(TS_WS,'FINALCHK',STS_TS,0)),'——') AS FINALCHK
FROM STT
LEFT JOIN STTS ON ST_ITEM = STS_ITEM
AND ST_VER = STS_VER
GROUP BY ST_ITEM, ST_VER, ST_CFMMAN, ST_TRMAN
ORDER BY ST_ITEM, ST_VER;

碧水幽幽泉 2017-11-29
  • 打赏
  • 举报
回复
去掉AS FINALCHK, 后面的逗号
		
SELECT ST_ITEM,
ST_VER,
CASE WHEN ST_CFMMAN IS NULL THEN 'NO' ELSE 'YES' END AS ST_CFMMAN,
CASE WHEN ST_TRMAN IS NULL THEN 'NO' ELSE 'YES' END AS ST_TRMAN,
NVL(SUM(DEOCDE(TS_WS,'IQC',STS_TS,0)),'——') AS IQC,
NVL(SUM(DEOCDE(TS_WS,'ZC-PD',STS_TS,0)),'——') AS ZCPD,
NVL(SUM(DEOCDE(TS_WS,'SMT-PD',STS_TS,0)),'——') AS SMTPD,
NVL(SUM(DEOCDE(TS_WS,'SMT-CS',STS_TS,0)),'——') AS SMTCS,
NVL(SUM(DEOCDE(TS_WS,'SMT-SS',STS_TS,0)),'——') AS SMTSS,
NVL(SUM(DEOCDE(TS_WS,'AIM',STS_TS,0)),'——') AS AIM,
NVL(SUM(DEOCDE(TS_WS,'INSERT',STS_TS,0)),'——') AS INSERT,
NVL(SUM(DEOCDE(TS_WS,'REPAIR',STS_TS,0)),'——') AS REPAIR,
NVL(SUM(DEOCDE(TS_WS,'VIEWICT',STS_TS,0)),'——') AS VIEWICT,
NVL(SUM(DEOCDE(TS_WS,'FCMCCHK',STS_TS,0)),'——') AS FCMCCHK,
NVL(SUM(DEOCDE(TS_WS,'ASSY',STS_TS,0)),'——') AS ASSY,
NVL(SUM(DEOCDE(TS_WS,'FINALCHK',STS_TS,0)),'——') AS FINALCHK
FROM STT
LEFT JOIN STTS ON ST_ITEM = STS_ITEM
AND ST_VER = STS_VER
GROUP BY ST_ITEM, ST_VER, ST_CFMMAN, ST_TRMAN
ORDER BY ST_ITEM, ST_VER;

碧水幽幽泉 2017-11-29
  • 打赏
  • 举报
回复

试试这个:
		
SELECT ST_ITEM,
ST_VER,
CASE WHEN ST_CFMMAN IS NULL THEN 'NO' ELSE 'YES' END AS ST_CFMMAN,
CASE WHEN ST_TRMAN IS NULL THEN 'NO' ELSE 'YES' END AS ST_TRMAN,
NVL(SUM(DEOCDE(TS_WS,'IQC',STS_TS,0)),'——') AS IQC,
NVL(SUM(DEOCDE(TS_WS,'ZC-PD',STS_TS,0)),'——') AS ZCPD,
NVL(SUM(DEOCDE(TS_WS,'SMT-PD',STS_TS,0)),'——') AS SMTPD,
NVL(SUM(DEOCDE(TS_WS,'SMT-CS',STS_TS,0)),'——') AS SMTCS,
NVL(SUM(DEOCDE(TS_WS,'SMT-SS',STS_TS,0)),'——') AS SMTSS,
NVL(SUM(DEOCDE(TS_WS,'AIM',STS_TS,0)),'——') AS AIM,
NVL(SUM(DEOCDE(TS_WS,'INSERT',STS_TS,0)),'——') AS INSERT,
NVL(SUM(DEOCDE(TS_WS,'REPAIR',STS_TS,0)),'——') AS REPAIR,
NVL(SUM(DEOCDE(TS_WS,'VIEWICT',STS_TS,0)),'——') AS VIEWICT,
NVL(SUM(DEOCDE(TS_WS,'FCMCCHK',STS_TS,0)),'——') AS FCMCCHK,
NVL(SUM(DEOCDE(TS_WS,'ASSY',STS_TS,0)),'——') AS ASSY,
NVL(SUM(DEOCDE(TS_WS,'FINALCHK',STS_TS,0)),'——') AS FINALCHK,
FROM STT
LEFT JOIN STTS ON ST_ITEM = STS_ITEM
AND ST_VER = STS_VER
GROUP BY ST_ITEM, ST_VER, ST_CFMMAN, ST_TRMAN
ORDER BY ST_ITEM, ST_VER;

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧