2016-07-18 5 views
1

Oracle 데이터베이스에서 쿼리를 실행하려고합니다.여러 조인을 사용하는 Oracle ROWNUM

내 테이블 구조는 다음

  • D - 일대일
  • O가 O를 - r에 일대
  • O - 해요 대다 (비아 MTM)

나는 다음과 같은 쿼리를 사용하고 있습니다 :

SELECT o.id ID, ROWNUM rn            /*row 1*/ 
FROM TABLE_D d 
LEFT JOIN TABLE_O o ON d.O_ID=o.ID 
RIGHT JOIN TABLE_R r ON r.O_ID = o.ID AND r.TYPE = 'SOME_TYPE'   /*row 4*/ 
RIGHT JOIN TABLE_MTM mtm ON o.ID = mtm.ORD_ID       /*row 5-6*/ 
RIGHT JOIN TABLE_M m ON mtm.M_ID = m.ID AND m.TYPE = 'SOMETHING_ELSE' /*row 5-6*/ 

WHERE o.ACTIVE=0 

ORDER BY o.SOME_COL ASC; 

을 (이것은 단지 작은 페이지입니다 내 전체 쿼리 예술; 네, ROWNUM, 'd'테이블 및 모든 것이 필요합니다)

  • 이 쿼리를 실행하면 결과가 반환되지 않습니다. I는 SELECT에서 ROWNUM을 제거하면
  • 는 그것이 내가 행 5 열 (6)은, 그 결과를 반환 제거하면
  • 결과 반환 I는 4 행을 삭제하는 경우 결과를
  • 를 반환한다.

아무도 내가 누락 된 부분을 말할 수 있습니까?

업데이트 : 모두 잘 Oracle 12c에서 작동합니다. 10g에서 올바르게 작동하지 않습니다.

+0

줄 별명 "d"에 ROWNUM에 접두어를 붙였습니까? –

+0

ROWNUM이 (가) 테이블의 열이 아닙니다. –

답변

1

당신은 많은 것들을 누락하십시오 LEFT JOIN를 들어,

SELECT o.id ID, ROWNUM as rn            /*row 1*/ 
FROM TABLE_D d LEFT JOIN 
    TABLE_O o 
    ON d.O_ID = o.ID AND o.ACTIVE = 0 LEFT JOIN 
    TABLE_R r 
    ON r.O_ID = o.ID AND r.TYPE = 'SOME_TYPE' LEFT JOIN   /*row 4*/ 
    TABLE_MTM mtm 
    ON o.ID = mtm.ORD_ID LEFT JOIN       /*row 5-6*/ 
    TABLE_M m 
    ON mtm.M_ID = m.ID AND m.TYPE = 'SOMETHING_ELSE' /*row 5-6*/ 
ORDER BY o.SOME_COL ASC; 

첫째는 테이블에 조건은 ON 절하지 WHERE 절에 있어야합니다. 둘째, RIGHT JOIN의 경우 첫 번째 테이블의 조건은 ON 절에 있어야합니다. 두 번째 테이블의 조건 (RIGHT JOIN의 경우)은 행을 필터링하지 않습니다.

실제로 어떤 작업을하고 있고 실제로 필요로하는지 알지 못하는 한 동일한 검색어에 LEFT JOINRIGHT JOIN을 섞어서는 안됩니다. 나는 LEFT JOIN과 위의 구조가 정확해야한다고 생각합니다.

+0

답해 주셔서 감사합니다. 모범 사례에 대한 조언을 정말 고맙겠지 만, 왜 아직도 이런 일이 일어나고 있는지 모르겠습니다. –

+0

@JakabfiAttila. . . 아마도'o.ACTIVE = 0'을 갖는 행이 없기 때문에 아마도 발생합니다. 왼쪽 및 오른쪽 조인의 조합을 따르기가 쉽지 않으므로 다른 조건도있을 수 있습니다. –