我只是尝试在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 抱歉。
我宁愿弄清楚如何正确地关联它,但是,如果可能的话 - 像子查询一样工作的视图需要永远建立。
答案 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
还有其他地方也需要这样做。
如果不是这种情况,请从查询中删除它们,因为它们无关紧要并且分散注意力。