2011-04-18 8 views
3

여러 개의 중첩 된 쿼리 계층을 사용하여 상당히 복잡한 쿼리가 있습니다. 쿼리의 요구 사항 중 하나는 기본 쿼리에서 하위 쿼리의 하위 쿼리에서 필드에 액세스한다는 것입니다. 그러나 중간 쿼리의 집계 때문에 해당 쿼리에 필드를 포함 할 수 없습니다.하위 하위 쿼리의 필드 액세스 SQL

예 :

select a, d.x, f.v? 
from b 
    join (select a, max(z), min(z), Count(y) as x 
     from c 
      join (select a, Count(t) as v 
       from e 
       ) f 
      on f.a = c.a 
      Group By a 
      Having min(z) <> max(z) 
     ) d 
    on d.a = b.a 

이것은 가능합니까?

+0

jas, 예를 들어, 적절한 쿼리에서 집계를 수정할 수 있습니까? 기본적으로, 내부 레이어에서이를 잃어 버릴 필요가 있다면 행을 다시 폭발시키지 않고 다시 가져올 수 없습니다. – Beth

답변

3

대신 사용해보십시오. 기본적으로 계층 구조로 올라갈 때 필요한 속성을 가져온 다음 필요에 따라 이름을 바꿀 수 있습니다.

Select a, d.fa From b 
join (select a,f.a fa from c 
join (select a from e) f on f.a = c.a 
) d on d.a = b.a 

아직 테스트 테이블이 없습니다. 더 이상의 문제가 있으면 여기에 게시하십시오.

* 편집 업데이트 질문 *

도 여기에 근거 논리는 ... 당신이 중 하나를 사용해야합니다,

select a, d.x, d.v? 
from b 
    join (select a, f.v, max(z), min(z), Count(y) as x 
     from c 
      join (select a, v 
       from e 
       ) f 
      on f.a = c.a 
      Group By a, f.v 
      Having min(z) <> max(z) 
     ) d 
    on d.a = b.a 

을 동일하게 유지 아니면 데이터베이스 스칼라 서브를 지원하는 경우 쿼리를 사용하면 최종 외부 쿼리에서 값을 얻을 수 있습니다.

select a, d.x, (select v from e where e.a = b.a) f_v 
from b 
    join (select a, max(z), min(z), Count(y) as x 
     from c 
      join (select a, v 
       from e 
       ) f 
      on f.a = c.a 
      Group By a 
      Having min(z) <> max(z) 
     ) d 
    on d.a = b.a 
+0

안녕하세요 죄송합니다. 방금 편집했습니다 집계로 인해 중간 쿼리에 필드를 포함 할 수 없다는 것을 잊지 마십시오 – jas

+0

집계 (적어도 샘플)를 사용하는 방법을 보여주기 위해 쿼리를 수정할 수 있습니까? 짧은 대답은 아니오, 당신은 2 단계 아래에서 그들을 액세스 할 수 없습니다,하지만 항상 주위에 작품입니다. :) –

+0

더 명확한가요? – jas

1

방금 ​​테이블 y (이 경우에는 e)를 From 절로 다시 가져 오십시오.

SELECT a, 
     d.x, 
     e.v 
FROM b 
     JOIN (SELECT a, 
          MAX(z), 
          MIN(z), 
          COUNT(y) AS x 
        FROM c 
          JOIN (SELECT a 
           FROM e) f 
          ON f.a = c.a 
        GROUP BY a 
        HAVING MIN(z) <> MAX(z)) d 
     ON d.a = b.a 
     JOIN (SELECT a, Count(t) as v 
      FROM e 
      GROUP BY A) e 
     ON e.a = d.a 
+0

죄송합니다. 그 자체를 집계 함수로 포함하는 것을 잊었습니다. 기본 쿼리의 데이터가 동일한 값을 반환하지 않습니다. – jas

+0

@jas이 변경 사항을 반영하여 답변을 업데이트했습니다. 'd' 하위 쿼리에서 실제로''Count (t) as v''를 사용하지 않는 것처럼 보입니다. 그렇기 때문에 별도의 쿼리로 그 부분을 끌어낼 가치가 있습니다. –