SQL codeSELECT T4.BUSSELFNO,

T4.LINENAME,

T4.BUSCLASS,

T4.DRIVERACODE,

T4.DRIVERANAME,

T4.FIRSTTIME,

TO_CHAR('') AS DRIVERBCODE,

TO_CHAR('') AS DRIVERBNAME,

TO_DATE('', 'YYYY-MM-DD HH24:MI:SS') AS CHANGETIME

FROM PI_BUSINFO T1

LEFT JOIN V_PI_DISPATCHPLAN_CCY T4

ON T1.BUSSELFNO = T4.BUSSELFNO

WHERE T1.AREAOWNER = 0

AND T1.BUSSTATUS <> 0

AND SYSDATE > T4.FIRSTTIME

--AND T4.BUSSELFNO NOT IN

AND NOT EXISTS

(SELECT T6.BUSSELFNO

FROM V_PI_POSINOUT_CCY T6

WHERE T6.ENTERTIME BETWEEN

TO_DATE(TO_CHAR(SYSDATE, 'yyyy-mm-dd') || ' ' || '00:00:00',

'yyyy-mm-dd hh24:mi:ss') AND

TO_DATE(TO_CHAR(SYSDATE, 'yyyy-mm-dd') || ' ' || '23:59:59',

'yyyy-mm-dd hh24:mi:ss')

AND T6.BUSSELFNO = T4.BUSSELFNO

UNION ALL

SELECT T7.BUSID

FROM PI_INOUT T7

WHERE T7.ENTERTIME BETWEEN

TO_DATE(TO_CHAR(SYSDATE, 'yyyy-mm-dd') || ' ' || '00:00:00',

'yyyy-mm-dd hh24:mi:ss') AND

TO_DATE(TO_CHAR(SYSDATE, 'yyyy-mm-dd') || ' ' || '23:59:59',

'yyyy-mm-dd hh24:mi:ss')

AND T7.BUSSELFNO = T4.BUSSELFNO);

------解决方案--------------------

补充一点:在T6和T7的 BUSSELFNO 字段上建一个索引。

另外:V_PI_POSINOUT_CCY 如果是个视图的话,建议先把数据查出来放到临时表中,建立索引再查询临时表的数据。探讨

1、先回答你得第二个问题

你的t7.entertime 和 t6.entertime 上面肯定有索引。

你得第一种写法在 这个字段上加了一个 trunc 函数,导致索引失效了,而第二个没有导致索引失效,原因就是这么简单。

2、再回答你的第一个问题,not in 和 not exists 不能等价的替换的,有一点点小区别,not exists 里面需要跟主表有关联关系的,根据你写的sql,……

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐