Sql 子查询问题

Sql 子查询问题,sql,oracle,plsql,plsqldeveloper,Sql,Oracle,Plsql,Plsqldeveloper,我有以下疑问: 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(

我有以下疑问:

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)
此查询根据以下条件从PACKAGES表中选择PACKAGES details:

包装箱的状态必须已装运。通过将PACKAGE_Statistics的PACKAGESTATUS列设置为2表示 如果一个包有多个已发货条目,请根据CREATIONDATE列值选择latestbased。 当我运行上面的查询时,它抛出了ORA-00904错误,因为级别2的子查询引用了表名。因此,我对查询进行了如下修改:

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) 
它再次抛出ORA-00904 SHIPPEDDATE无效标识符。 请告诉我怎么做? 谢谢大家,,
Pradeep

如果您只需要来自PACKAGE\u统计的最新日期,为什么不直接使用MAXCREATION\u日期?我现在无法测试它,但您可能需要这样的查询:

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

如果您想从最新创建日期的PACKAGEL统计数据行中获取更多的详细信息,请考虑使用解析函数:

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;

嗨,马辛,谢谢你的回复…我需要每个包裹的最大发货日期。也就是说,每个包裹在包裹统计表中都有零个或多个装运状态条目。如果没有与包对应的Shipped status条目,则我不希望将该包包含在结果集中。否则,我只需要最近添加的Shipped Entry。因此,如果我没有出现任何语法错误,我的第一个查询应该返回您想要的内容。事实上,您的第二个查询做到了这一点。在实际场景中,我必须获取连接8个表的20多列。所以,我选择了第二个。非常感谢