Oracle在FROM列表中关联子查询

时间:2009-03-04 17:44:43

标签: oracle oracle10g subquery sql

我只是尝试在Oracle中的FROM语句的SELECT子句中执行相关子查询,但是我收到一个错误,表明我无法进行相关(事情有效) Obs.pID未被识别。

这应该有用吗?

FROM ml.Person Person 
    JOIN ml.Obs ON Person.pID = Obs.pId
        JOIN (SELECT ObsMax2.pId, ObsMax2.hdId
                , MAX(ObsMax2.obsDate) as maxDate
                FROM ml.Obs ObsMax2
                WHERE ObsMax2.pId = Obs.pId
                    AND ObsMax2.obsDate < {?EndDate}
                GROUP BY ObsMax2.pId, ObsMax2.hdId) ObsMax 
            ON Obs.pId = ObsMax.pId
                AND Obs.hdId = ObsMax.hdId
                AND Obs.obsDate = ObsMax.maxDate

我的解决方法似乎是使它成为一个不相关的子查询,并为子查询添加标准,使其不能完全运行,amuck,amu - oof 抱歉。

我宁愿弄清楚如何正确地关联它,但是,如果可能的话 - 像子查询一样工作的视图需要永远建立。

3 个答案:

答案 0 :(得分:4)

通过使用分析函数来识别每个pid和hdid的最大obsDate,您可以实现此部分查询的目的。

这将是:

select ...
from   (
       SELECT pId,
              hdId,
              obsDate
              MAX(obsDate) over (partition by pId, hdId) maxDate
       FROM   ml.Obs
       WHERE  obsDate < {?EndDate}
       )
where  obsDate = maxDate
/

答案 1 :(得分:3)

FROM子句中的子查询不能引用同一FROM子句中的其他表。删除ObsMax2.pId = Obs.pId子句应解决问题,因为相同的子句处于连接条件,我可以告诉您将给出完全相同的结果。但是,正如您所提到的,在子查询中使用GROUP BY可能会遇到性能问题。

据我所知,你试图从ml.Obs中获取单个pID / hdId记录,其中最大的obsDate小于{EndDate}。在这种情况下,将子查询移动到WHERE子句中可以将它关联起来呢? E.g:

select ...
from
  ml.Person Person
  join ml.Obs on Person.PID = Obs.pId
where Obs.obsDate = (
    select max(obsDate)
    from ml.Obs Obs2
    where Obs2.pId = Obs.pId
      and obs2.hdId = Obs.hdId
      and Obs2.obsDate < {EndDate})

答案 2 :(得分:0)

你已经用“ml”为你的许多表做了前缀。但不是所有地方(例如第一次加入)。假设您需要(对于用户/权限/无论如何):

加入ml.Obs ON Person.pID = ** ml。** Obs.pId

加入ml.Obs Obs ON Person.pID = Obs.pId

还有其他地方也需要这样做。

如果不是这种情况,请从查询中删除它们,因为它们无关紧要并且分散注意力。