Проблема с подзапросом - PullRequest
0 голосов
/ 22 марта 2011

У меня следующий запрос:

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 на основании следующих условий:

  1. Состояние пакетов должно быть "Отправлено". (Указывается установкой столбца PACKAGESTATUS в PACKAGE_STATISTICSto 2)
  2. Если для пакета имеется несколько записей «Отправлено», выберите последний (на основе значения столбца CREATIONDATE).

Когда я выполнял вышеуказанный запрос, он выдавал ошибку 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 Неверный идентификатор. Пожалуйста, дайте мне знать, как я могу это сделать? Спасибо вам всем, Прадип

1 Ответ

0 голосов
/ 22 марта 2011

Если вам нужна только последняя дата из PACKAGE_STATISTICS, почему бы вам просто не использовать MAX (CREATION_DATE)?Я не могу проверить это прямо сейчас, но вам, вероятно, нужен запрос, подобный следующему:

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

Если вы хотите получить более подробную информацию из строки 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...