1

我只是尝试在 OracleFROM中的语句的子句中执行关联子查询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、amuck、amu--oof抱歉

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

4

3 回答 3

5

您可以通过使用分析函数确定每个 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
/
于 2009-03-05T02:38:52.953 回答
3

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

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

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})
于 2009-03-04T19:27:44.503 回答
0

您已经为许多表格添加了“ml”前缀。但并非无处不在(例如,第一次加入)。假设您需要(对于用户/权限/其他):

在 Person.pID 上加入 ml.Obs = **ml.**Obs.pId

或者

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

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

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

于 2009-03-04T19:28:33.080 回答