简体   繁体   English

子查询问题

[英]Issue with Sub-query

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: 该查询根据以下条件从“包”表中选择包详细信息:

  1. The status of the packgae must be "Shipped".(Indicated by setting PACKAGESTATUS column of PACKAGE_STATISTICSto 2) packgae的状态必须为“已打包”。(通过将PACKAGE_STATISTICS的PACKAGESTATUS列设置为2来指示)
  2. If there are multiple "Shipped" entries for a package, select the latest(based on CREATIONDATE column value). 如果一个程序包有多个“已拆封”条目,请选择最新的(基于CREATIONDATE列值)。

When I run the above query it throwed ORA-00904 error as the subquery of level 2 refres the table name. 当我运行上述查询时,由于第2级的子查询引用了表名,它引发了ORA-00904错误。 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. 它再次引发了ORA-00904 SHIPPEDDATE无效标识符。 Please let me know how can I do this? 请让我知道我该怎么做? Thanking you all, Pradeep 谢谢大家,Pradeep

If you need only the latest date from PACKAGE_STATISTICS, why don't you simply use MAX(CREATION_DATE)? 如果您只需要PACKAGE_STATISTICS中的最新日期,为什么不简单地使用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: 如果您想从package_statistics行中获取具有最新创建日期的更多详细信息,请考虑使用分析函数:

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM