您的查询的问题是您完全连接两个表,然后针对整个结果执行 max 函数,最后 where 语句过滤您的行。
您已经改进了连接,只需连接具有特定 custid 的行而不是完整的表,应该如下所示:
SELECT U.SEQ, MAX(O.ORDER_DATE) FROM
(SELECT * FROM CUST_MST WHERE SEQ = :customerNumber ) U
INNER JOIN
(SELECT * FROM ORD_MST WHERE CUST_NUM = :customerNumber) O ON U.SEQ = O.CUST_NUM
GROUP BY U.SEQ;
另一种选择是使用 order by 并过滤第一个 rownum。它不是干净的方式。可能会更快,如果不是,您还需要一个子选择来不订购完整的表格。有一段时间没有使用 oracle,但它应该看起来像这样:
SELECT * FROM
(
SELECT U.SEQ, O.ORDER_DATE FROM CUST_MST U
INNER JOIN ORD_MST O ON U.SEQ = O.CUST_NUM
WHERE U.SEQ = :customerNumber
GROUP BY U.SEQ;
ORDER BY O.ORDER_DATE DESC
)
WHERE ROWNUM = 1
您是否出于某种原因被迫使用联接,或者为什么不直接从 ORD_MST 中选择而不使用联接?
编辑
还有一个想法:
SELECT * FROM
(SELECT CUST_NUM, MAX(ORDER_DATE) FROM ORD_MST WHERE CUST_NUM = :customerNumber GROUP BY CUST_NUM) O
INNER JOIN CUST_MST U ON O.CUST_NUM = U.SEQ
如果内部选择只需要一秒钟,那么连接应该立即生效。