Oracle - способ переписать этот запрос, чтобы не использовать подвыборы? - PullRequest
1 голос
/ 21 сентября 2011

Я пытаюсь создать материализованное представление в Oracle 11.1, которое, по-видимому, не поддерживает вложенные выборки в материализованном представлении (почему это не удалось выяснить). Есть ли способ написатьэтот запрос работать как материализованное представление?Спасибо!

CREATE MATERIALIZED VIEW MV_Area90DayReport
  NOLOGGING
  CACHE
  BUILD IMMEDIATE 
  REFRESH FAST ON COMMIT 
  AS 
    select
      T.TASKID,
      V.PROJECTID,
      V.VERSIONID,
      T.GOLDDATE,
      P.BUSINESSLAUNCHDATE,
      V.NAME as ProjectName,
      T.NAME as TaskName,
      T.COURSECODE,
      DT.NAME as DeliveryMethod,
      T.DELIVERABLELENGTHHOUR,
      T.DELIVERABLELENGTHMINUTE,
      V.PRIORITY,
      (SELECT MIN(STARTDATE) FROM TPM_TRAININGPLAN WHERE PROJECTID=V.PROJECTID AND TRAININGPLANTYPE='prescribed') as TrainingDeliveryDate,
      (SELECT wm_concat(WORKGROUPID) FROM TPM_PROJECTWORKGROUPS WHERE PROJECTID=V.PROJECTID GROUP BY PROJECTID) as Workgroups,
    from TPM_TASK T
    inner join TPM_PROJECTVERSION V ON (V.PROJECTID = T.PROJECTID AND V.VERSIONID = T.VERSIONID)
    inner join TPM_PROJECT P ON (P.PROJECTID = T.PROJECTID)
    inner join TPM_DOCUMENTTYPE DT ON (DT.DOCUMENTTYPEID = T.DOCUMENTTYPEID);

Я получаю ошибку:

>[Error] Script lines: 1-25 -------------------------
 ORA-22818: subquery expressions not allowed here
 Script line 20, statement line 20, column 115 

Ответы [ 2 ]

2 голосов
/ 21 сентября 2011

Я полагаю, что это ограничение (которое возникло как ошибка когда-то назад), задокументированное здесь на сайте Oracle - http://download.oracle.com/docs/cd/B12037_01/server.101/b10736/basicmv.htm#sthref431

Чтобы решить, вы должны использовать JOINS, а не подзапросы.

1 голос
/ 21 сентября 2011

Попробуйте следующий запрос:

select
  T.TASKID,
  V.PROJECTID,
  V.VERSIONID,
  T.GOLDDATE,
  P.BUSINESSLAUNCHDATE,
  V.NAME as ProjectName,
  T.NAME as TaskName,
  T.COURSECODE,
  DT.NAME as DeliveryMethod,
  T.DELIVERABLELENGTHHOUR,
  T.DELIVERABLELENGTHMINUTE,
  V.PRIORITY,
  TP.TrainingDeliveryDate,
  WG.Workgroups,
from TPM_TASK T
inner join TPM_PROJECTVERSION V ON (V.PROJECTID = T.PROJECTID AND V.VERSIONID = T.VERSIONID)
inner join TPM_PROJECT P ON (P.PROJECTID = T.PROJECTID)
inner join TPM_DOCUMENTTYPE DT ON (DT.DOCUMENTTYPEID = T.DOCUMENTTYPEID)
left join (
  SELECT PROJECTID, MIN(STARTDATE) as TrainingDeliveryDate
  FROM TPM_TRAININGPLAN
  WHERE TRAININGPLANTYPE='prescribed'
  GROUP BY PROJECTID
) TP on TP.PROJECTID=V.PROJECTID
left join (
  SELECT PROJECTID, wm_concat(WORKGROUPID) as Workgroups
  FROM TPM_PROJECTWORKGROUPS
  GROUP BY PROJECTID
) WG on WG.PROJECTID=V.PROJECTID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...