조인시 레코드의 관계가 궁금합니다. 0 1 1,081

by 개발초보 [SQL Query] JOIN SQL [2020.09.18 15:10:29]


안녕하세요. 초급 개발자 입니다.

 

SQL문 관련 질의 사항이 있어 글을 남기게 되었습니다.

 

조인 시 셀렉문에 기본 테이블의 정보를 확인하며, 참조 테이블의 데이터합계에 따라 지급 금액을 결정하는 쿼리를 만들었습니다.

 

제가 생각하기로는, 참조 테이블의 데이터가 존재하지 않아도 기본 테이블의 정보를 보여주는게 OUTER JOIN으로 알고 있었으나,

 

레코드 값은 전부 NULL로 표기됩니다.

질의 쿼리는 아래와 같습니다.

SELECT a.재직상태
	 , SUM(b.지급될 급여, 0.0) AS 지급될급여
  FROM 회원정보 a
  LEFT OUTER JOIN 급여대장 b
    ON a.회원시퀀스 = b.회원시퀀스
 WHERE a.회원시퀀스 = 1
   AND NOW() BETWEEN b.급여지급시작일 AND b.급여지급종료일
   AND b.근무상태 = 'Y';

 

현재 1번 회원은 기본테이블에만 데이터를 보유하고 있는 상황이며, 참조테이블에는 데이터가 존재하지 않습니다.

 

또한, 이 쿼리문에서 참조테이블의 조건을 삭제하였을 때에는 재직상태가 정상적으로 출력됩니다.

 

다른 회원은 참조테이블의 데이터가 존재하지 않아도 재직상태를 보여주기 때문에, 어느 부분에서 문제가 된 것인지 잘 모르겠습니다.

 

질문에 답변해주시면 감사하겠습니다.

by 마농 [2020.09.18 15:33:03]

1. 조건절 위치 오류
 - 검색조건은 WHERE 절에
 - 조인조건은 ON 절에
2. Group By 구문 오류
 - MySQL 에서만 허용되는 구문입니다.
 - MySQL 에서는 오류는 안나지만, SQL 표준 문법에 맞도록 작성하는 것이 좋습니다.

SELECT a.재직상태
     , IFNULL(SUM(b.지급될급여), 0) AS 지급될급여
  FROM 회원정보 a
  LEFT OUTER JOIN 급여대장 b
    ON a.회원시퀀스 = b.회원시퀀스
   AND NOW() BETWEEN b.급여지급시작일 AND b.급여지급종료일
   AND b.근무상태 = 'Y'
 WHERE a.회원시퀀스 = 1
 GROUP BY a.재직상태
;

 

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