2009-03-04 13 views
1

오라클의 SELECT 문의 FROM 절에 상관 관계 부속 조회를 수행하려했으나 상관 관계를 수행 할 수 없다는 오류가 표시되었습니다 (Obs.pID 인정되지 않았다).FROM 목록의 Oracle 상관 관계 부속 조회

이 기능을 사용해야합니까?

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 

내 해결은 비 상관 하위 쿼리 할 것으로 보인다 및 OOF 죄송합니다 amu--, 미친 듯이 날 뛰어, 미친 듯이 날 뛰어 완전히 실행을 유지하는 하위 쿼리에 조건을 추가합니다.

가능하다면 올바르게 연관시키는 방법을 생각하고 싶습니다. 하위 쿼리처럼 작동하는보기는 영원히 구축됩니다.

+0

. 성취하고자하는 것에 관해 질문에 명확한 설명을 추가하는 것을 고려하십시오. – Alkini

+1

@David - "Pedant":-) @Alan -이 시스템의 내부 구조에 대해 어느 정도 말할 수 있을지 모르겠습니다. 일반적으로, 가장 최근의 관찰 결과를 얻기 위해 pID/hdID별로 그룹화하는 기본 제공보기를 사용합니다.하지만 2009 년이고 2008 년을 쿼리하는 경우 실패합니다. – SarekOfVulcan

답변

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 
/
+0

이 버전에 대한 설명 플랜은 내가 생각해 낸 것보다 조금 나아졌으며, 느껴졌다. 나는 전에 이것들에 부딪치지 않았다 - 감사합니다! – SarekOfVulcan

+0

문제 없음. 분석 함수는 매우 멋지다. –

+1

방금 ​​PARTITION BY를 사용하는 방법을 보여 주었고 문제를 해결했습니다. –

3

FROM 절의 하위 쿼리는 동일한 FROM 절의 다른 테이블을 참조 할 수 없습니다. ObsMax2.pId = Obs.pId 절을 제거하면 문제가 해결되어 동일한 조항이 조인 조건에 있으므로 정확히 동일한 결과를 얻을 수 있습니다. 그러나 언급 한 바와 같이 하위 쿼리에서 GROUP BY를 사용하면 성능 문제가 발생할 수 있습니다.

내가 알 수있는 것으로부터, 당신은 mls에서 개인 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}) 
+0

이 경우, 특히 필드는 단지 형식 날짜 일 뿐이므로 중복 된 날짜로 인해 둘 이상의 사용자가 반환 될 수 있다는 것을주의해야합니다. – Alkini

+0

예 (pId, hdId, obsDate) 조합이 고유하지 않으면 (pId, hdId) 쌍당 여러 레코드를 얻을 수 있습니다. 나는 원래의 쿼리는 같은 문제가 있다고 생각합니다. –

+0

이것은 EMR (의료 기록) 시스템에 대한 쿼리입니다. pId는 PersonId입니다. hdId는 의료 관찰 (BP, 펄스, LDL 등)을 식별합니다. 따라서 pid/hidid/date를 복제하는 것에 대해 걱정할 필요가 없습니다. 문서 당 하나의 가치가 있습니다. – SarekOfVulcan

0

많은 테이블에 "ml"이라는 접두어가 붙습니다. (예 : 첫 번째 조인). .

이 Person.pID = ON ml.Obs 가입하세요 ** ml의 **

이 ml.Obs 것을 제외하고 가입하세요

또는

Obs.pId : 당신이 (사용자// 어떤 권한에 대한) 것을 필요로 가정
ON Person.pID = Obs.pId

기타 필요한 곳도 있습니다.

그렇지 않은 경우 관련이 없으며 혼란 스럽기 때문에 쿼리에서 제거하십시오.