oracle->mysql 조인관련 0 7 1,387

by 초보개발자 [SQL Query] [2022.08.04 09:39:51]


안녕하세요

oracle에서 mysql 전환 공부진행중 join 관련


ORACLE
SELECT A.SYSTM_ID
        FROM A,B,C,D,E
        WHERE 1=1
        AND A.SYSTM_ID = C.SYSTM_ID(+)
        AND C.SYSTEM_ID = D.SYSTEM_ID(+)
        AND B.USER_ID(+) = #{loginId}
        AND B.USER_ID=E.USER_ID
        

MYSQL
SELECT A.SYSTM_ID
FROM A LEFT OUTER JOIN (C LEFT OUTER JOIN D ON C.SYSTEM_ID = D.SYSTEM_ID ) ON A.SYSTM_ID = C.SYSTM_ID,
     B RIGHT OUTER JOIN ????? on B.USER_ID = #{loginId}(여기서 방법이 궁급합니다)
     WHERE B.USER_ID=E.USER_ID

 

 

1. 위 처럼 조인이 겹칠 경우 위에 제가 한 방식이 DATA가 소수일때는 값은 똑같이 나오는데 만약
대량의 DATA가 있을 경우 값의 정확도에 의문이 있습니다.
2. table 조인 방법은 알겠지만 변수로 조건받는건 생소해서 질문드립니다.
3. B.USER_ID=E.USER_ID 조건일 경우 저는 평소 밑에 WHERE 구문만 작성했는데
   구글검색해보면 INNER JOIN 을 사용하는거 같아서 결과 값이 다르게 나오는지 질문드립니다.
   DATA가 적을 경우는 값은 비슷하게 나와서 어떤 방식이 옳은건지 궁금합니다.
by 마농 [2022.08.04 10:08:11]

1. Oracle 원본 쿼리는
- 조인 관계가 이상합니다. (a,c,d) 와 (b,e) 사이의 연결관계가 없습니다.
- b.user_id(+) 도 말이 안되는 아우터조인 조건입니다. (+)는 무의미.
- 원본 쿼리가 올바른지 확인이 필요합니다.
2. MySQL 쿼리는
- 괄호가 불필요하게 많이 사용되었고
- JOIN 구문과 컴마 구문이 혼용되어 이상합니다.
- 괄호를 없애고 JOIN 구문으로 통일시켜야 합니다.
 


by 초보개발자 [2022.08.04 10:35:35]

코드가 길어서 간략하게 올렸는데 그 과정에 빠진것같습니다.

혹 괄호한 부분 LEFT JOIN 대부분 저방식으로 했는데

데이터 값이 많이 달라질까요? 앞전에  진행한 부분이 많아서 

다 바꿔야 되는지 궁금해서 질문드립니다.

앞으로는 줄이는 방식으로 진행하겠습니다. 감사합니다


by 초보개발자 [2022.08.04 10:37:59]

제가 이때까지 위 코드 부분 조인 없이

where 에만 붙어 있는 경우 WHERE B.USER_ID=E.USER_ID

이부분은 from 단에서 inner join 없이 진행했는데

위와 같이 inner join 필수인가요? 

값이 비슷하게 나와서 아 이런식으로 되는구나 했는데 

잘못 안건지 .. 궁금합니다 ..

답변감사합니다.


by 마농 [2022.08.04 10:56:09]

INNER 조인이 필수다 아니다 문제가 아니고
데이터가 달라진다 아니다 문제가 아닙니다.
혼용해서 사용하면 가독성이 떨어지고 정확한 의미를 해석하기 어려워집니다.
잘못 된 쿼리 말고 올바른 쿼리로 질문해 주시면 좋을 듯 합니다.
지금 올려주신 원본 쿼리 자체가 이상해서 
이상한 걸 그대로 변경하는게 어렵습니다.
지금 원본쿼리에서 (a,c,d) 와 (b,e) 사이의 연결관계 조건을 하나 추가해 주시면 좋겠네요.
될수 있으면 원래의 쿼리와 동일한 의미가 되도록 왜곡없이 표현해 주시면 좋습니다.


by 초보개발자 [2022.08.04 11:01:26]

다음부턴 조심하겠습니다.

답변감사드립니다 

 


by 마농 [2022.08.04 16:26:08]
-- 올려 주신 이상한 원본 쿼리 그대로 ANSI SQL 로 옮겨 보면
-- B.USER_ID(+) = #{loginId} 조건에서의 (+) 는 무시하면 됩니다.
-- MySQL --
SELECT a.systm_id
  FROM a
  LEFT OUTER JOIN c
    ON a.systm_id = c.systm_id
  LEFT OUTER JOIN d
    ON c.system_id = d.system_id
 CROSS JOIN b
 INNER JOIN e
    ON b.user_id = e.user_id
 WHERE b.user_id = #{loginId}
;

 


by 초보개발자 [2022.08.08 11:56:37]

좀 생소해서 제가 잘모르는줄 알았는데

오타일수도 있겠네요  

많이 배웠습니다 

감사합니다 답변토대로 수정해보겠습니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입