Issue with Sub-query
-
28-10-2019 - |
Question
I have the following query:
SELECT SP.PACKAGEID,SP.ORDERID,PTS.CREATIONDATE AS SHIPPEDDATE
FROM PACKAGES SP
INNER JOIN
(
SELECT * FROM
(
SELECT *FROM PACKAGE_STATISTICS A
WHERE((A.PACKAGEID=SP.PACKAGEID)
AND(A.PACKAGESTATUS=2)
AND(TO_DATE(to_char(A.CREATIONDATE,'mm/dd/yyyy'),'mm/dd/yyyy')
BETWEEN TO_DATE('2/19/2011','mm/dd/yyyy') AND (TO_DATE('3/21/2011','mm/dd/yyyy'))))
ORDER BY A.CREATIONDATE
) WHERE ROWNUM<2
) PTS ON PTS.PACKAGEID=SP.PACKAGEID
WHERE SP.ISSUEID IN(402783)
This query selects package details from PACKAGES table based on the following conditions:
- The status of the packgae must be "Shipped".(Indicated by setting PACKAGESTATUS column of PACKAGE_STATISTICSto 2)
- If there are multiple "Shipped" entries for a package, select the latest(based on CREATIONDATE column value).
When I run the above query it throwed ORA-00904 error as the subquery of level 2 refres the table name. So I have modified the query as given below:
SELECT SP.PACKAGEID,SP.ORDERID, (SELECT CREATIONDATE FROM
(
SELECT *FROM PACKAGE_STATISTICSA
WHERE
((A.PACKAGEID=SP.PACKAGEID)
AND(A.PACKAGESTATUS=2)
AND(TO_DATE(to_char(A.CREATIONDATE,'mm/dd/yyyy'),'mm/dd/yyyy')
BETWEEN TO_DATE('2/19/2011','mm/dd/yyyy') AND (TO_DATE('3/21/2011','mm/dd/yyyy'))))
ORDER BY A.CREATIONDATE
) WHERE ROWNUM<2) AS SHIPPEDDATE
FROM PACKAGESSP
WHERE
(SHIPPEDDATE BETWEEN TO_DATE('2/19/2011','mm/dd/yyyy')
AND (TO_DATE('3/21/2011','mm/dd/yyyy')))
AND SP.ISSUEID IN(402783)
It again throwed ORA-00904 SHIPPEDDATE Invalid Identifier. Please let me know how can I do this? Thanking you all, Pradeep
Solution
If you need only the latest date from PACKAGE_STATISTICS, why don't you simply use MAX(CREATION_DATE)? I can't test it right now, but you probably need a query like this:
SELECT SP.PACKAGEID
,SP.ORDERID
,MAX(A.CREATIONDATE) AS SHIPPEDDATE
FROM PACKAGES SP
INNER JOIN PACKAGE_STATISTICS A ON A.PACKAGEID = SP.PACKAGEID
WHERE SP.ISSUEID IN (402783)
AND A.PACKAGEID = SP.PACKAGEID
AND A.PACKAGESTATUS = 2
AND TO_DATE(to_char(A.CREATIONDATE, 'mm/dd/yyyy'), 'mm/dd/yyyy') BETWEEN
TO_DATE('2/19/2011', 'mm/dd/yyyy') AND
TO_DATE('3/21/2011', 'mm/dd/yyyy')
GROUP BY SP.PACKAGEID
,SP.ORDERID
If you want more details from row of package_statistics with latest creationdate, consider using analytic functions:
SELECT SP.PACKAGEID
,SP.ORDERID
,PTS.*
FROM PACKAGES SP
INNER JOIN (SELECT ROW_NUMBER() OVER(PARTITION BY PACKAGEID ORDER BY CREATIONDATE DESC) rn
,A.*
FROM PACKAGE_STATISTICS A
WHERE A.PACKAGESTATUS = 2
AND TO_DATE(to_char(A.CREATIONDATE, 'mm/dd/yyyy')
,'mm/dd/yyyy') BETWEEN
TO_DATE('2/19/2011', 'mm/dd/yyyy') AND
TO_DATE('3/21/2011', 'mm/dd/yyyy')) PTS ON PTS.PACKAGEID =
SP.PACKAGEID
AND PTS.RN = 1;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow