简体   繁体   English

Oracle-重写此查询以不使用子选择的方法?

[英]Oracle - Way to rewrite this query to not use sub-selects?

I'm trying to create a materialized view in Oracle 11.1, which apparently does not support nested selects in a materialized view (Why this is, I haven't been able to figure out).. Is there a way to write this query to work as a materialized view? 我正在尝试在Oracle 11.1中创建一个实例化视图,该视图显然不支持在实例化视图中的嵌套选择(为什么这样做,我一直无法弄清楚)。有没有办法将此查询写到作为物化视图工作? Thanks! 谢谢!

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);

The error I get is: 我得到的错误是:

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

I believe this is a limitation (that was raised as a bug sometime back), documented here on the Oracle site - http://download.oracle.com/docs/cd/B12037_01/server.101/b10736/basicmv.htm#sthref431 我认为这是一个限制(有时是作为错误提出的),在Oracle网站上有记录-http: //download.oracle.com/docs/cd/B12037_01/server.101/b10736/basicmv.htm# sthref431

To resolve, you should use JOINS rather than subqueries. 若要解决,您应该使用JOINS而不是子查询。

Try the following query: 请尝试以下查询:

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

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

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