안녕하세요
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가 적을 경우는 값은 비슷하게 나와서 어떤 방식이 옳은건지 궁금합니다.
1. Oracle 원본 쿼리는
- 조인 관계가 이상합니다. (a,c,d) 와 (b,e) 사이의 연결관계가 없습니다.
- b.user_id(+) 도 말이 안되는 아우터조인 조건입니다. (+)는 무의미.
- 원본 쿼리가 올바른지 확인이 필요합니다.
2. MySQL 쿼리는
- 괄호가 불필요하게 많이 사용되었고
- JOIN 구문과 컴마 구문이 혼용되어 이상합니다.
- 괄호를 없애고 JOIN 구문으로 통일시켜야 합니다.
코드가 길어서 간략하게 올렸는데 그 과정에 빠진것같습니다.
혹 괄호한 부분 LEFT JOIN 대부분 저방식으로 했는데
데이터 값이 많이 달라질까요? 앞전에 진행한 부분이 많아서
다 바꿔야 되는지 궁금해서 질문드립니다.
앞으로는 줄이는 방식으로 진행하겠습니다. 감사합니다
제가 이때까지 위 코드 부분 조인 없이
where 에만 붙어 있는 경우 WHERE B.USER_ID=E.USER_ID
이부분은 from 단에서 inner join 없이 진행했는데
위와 같이 inner join 필수인가요?
값이 비슷하게 나와서 아 이런식으로 되는구나 했는데
잘못 안건지 .. 궁금합니다 ..
답변감사합니다.
INNER 조인이 필수다 아니다 문제가 아니고
데이터가 달라진다 아니다 문제가 아닙니다.
혼용해서 사용하면 가독성이 떨어지고 정확한 의미를 해석하기 어려워집니다.
잘못 된 쿼리 말고 올바른 쿼리로 질문해 주시면 좋을 듯 합니다.
지금 올려주신 원본 쿼리 자체가 이상해서
이상한 걸 그대로 변경하는게 어렵습니다.
지금 원본쿼리에서 (a,c,d) 와 (b,e) 사이의 연결관계 조건을 하나 추가해 주시면 좋겠네요.
될수 있으면 원래의 쿼리와 동일한 의미가 되도록 왜곡없이 표현해 주시면 좋습니다.
다음부턴 조심하겠습니다.
답변감사드립니다
-- 올려 주신 이상한 원본 쿼리 그대로 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}
;
좀 생소해서 제가 잘모르는줄 알았는데
오타일수도 있겠네요
많이 배웠습니다
감사합니다 답변토대로 수정해보겠습니다