我需要帮助来重写下面的 Oracle SQL 查询,因为该查询会长时间执行而不会停止。我尝试使用联接重写查询,但结果不是我想要的。谢谢你。
SELECT ADDRESS_ID,
ADDRESS,
NETWORKCONVERAGE,
ADDRESSBUILDINGTYPE,
ADDRESSBUILDINGNAME,
ADDRESSPOSTCODE,
FTP_NAME,
ORDER_ID_NEW,
ORDER_STATUS,
INSTALLATION_DATE
FROM (
SELECT ADDRESSPOSTCODE || '_' || ADDRESSHOUSENUMBER || '_' || ADDRESSFLOORNUMBER || '_' || ADDRESSUNITNUMBER ADDRESS_ID,
ADDRESSHOUSENUMBER || ' ' || ADDRESSSTREETNAME || ' #' || ADDRESSFLOORNUMBER || '-' || ADDRESSUNITNUMBER || ' Singapore ' || ADDRESSPOSTCODE ADDRESS,
NETWORKCONVERAGE,
ADDRESSBUILDINGTYPE,
ADDRESSBUILDINGNAME,
ADDRESSPOSTCODE,
SUBSTR(FTPPORT, 1, INSTR(FTPPORT, '/', 1) - 1) FTP_NAME,
ORDER_ID_NEW,
FORM_STATUS ORDER_STATUS,
TO_DATE(INSTALLATIONDATE, 'YYYYMMDD') INSTALLATION_DATE
FROM ARADMIN4.ON_ADVANCEDINTERFACE_PORTALRES
WHERE SUBSTR(ORDER_ID_NEW, 4, 2) = '01'
AND SCHEDULE = '01'
)
WHERE ADDRESS_ID NOT IN (
SELECT (ADDRESSPOSTCODE || '_' || ADDRESSHOUSENUMBER || '_' || ADDRESSFLOORNUMBER || '_' || ADDRESSUNITNUMBER)
FROM ARADMIN4.ON_ADVANCEDINTERFACE_PORTALRES
WHERE SUBSTR(ORDER_ID_NEW, 4, 2) = '01'
AND SCHEDULE = '01'
AND FORM_STATUS = 'Completed'
);
我尝试使用 join 重写查询,但结果不是我想要的。
1 ADDRESS_ID 可能有几个 ORDER_ID 具有不同的 ORDER_STATUS(已完成、已拒绝等)。我想获取没有 ORDER_ID 且 ORDER_STATUS = 'Completed' 的 ADDRESS_ID。
例如,01_01_01 的 ORDER_ID_1 状态 = 已完成,ORDER_ID_2 状态 = 拒绝,02_02_02 的 ORDER_ID_1 状态 = 拒绝,ORDER_ID_2 状态 = 待处理,那么当我运行 SQL 查询时,它应该只返回 02_02_02。
使用以下提示运行查询
SELECT /*+ GATHER_PLAN_STATISTICS * ADDRESS_ID,
ADDRESS,
NETWORKCONVERAGE,
ADDRESSBUILDINGTYPE,
ADDRESSBUILDINGNAME,
ADDRESSPOSTCODE,
FTP_NAME,
ORDER_ID_NEW,
ORDER_STATUS,
...
...
然后运行
select * from table(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST +COST'))
这将评估优化器估计值与每个执行阶段的实际数字有何不同。
这是调整 SQL 语句的绝佳第一步