sql 질문드립니다. 0 3 551

by 조용히 살고 싶다 [SQL Query] [2020.02.28 13:09:33]


A 테이블 : (주키) 메세지ID, 이벤트 일련번호, 수신회원번호, 수신사용자ID

               (항목) 메세지 내역, 통지일자

B 테이블 : (주키) 분류코드 , 사용자번호, 시작일자, 종료일자 

              (항목) 사용자이름

 

A 테이블의 내용을 보여주는데 이때 

A 테이블의 내용을 기반으로 B 테이블의 사용자이름을  보여줍니다. 

 

SELECT 사용자이름

FROM B

WHERE B.사용자번호 = A.사용자번호 

   AND A.통지일자 BETWEEN B.시작일자 AND B.종료일자

   AND ROWNUM = 1

위 쿼리로 해서 A테이블 검색내용중 사용자이름을 B테이블에서 구해서 보여주고 싶습니다. 

ROWNUM = 1 때문에 어떻게 해야할지 

도움 부탁드립니다. 

 

 

  

              

                             

by 마농 [2020.02.28 13:54:07]

b 테이블의 사용자번호 하나에 대해 시간이 겹치는 경우가 있을 수 있는지?
중복된 자료가 있을 수 잇다면? 테이블 설계가 잘못되었거나? 오류자료가 입력된 건 아닌지?
정상적으로 중복된 자료가 없다면? 그냥 between 조인하면 됩니다.


by 조용히 살고 싶다 [2020.02.28 23:16:02]

B테이블에 분류코드 값이 달라지면 사용자번호와 시간은 겹칠수 있습니다. 그런데 데이터 조회해 보니  사용자번호와 시간이 겹치진 않더라고요. 그런데 혹시나 같은 내용에 분류코드만 다르게 들어올까해서요. 

이때 사용자 이름이 두개가 나오면 곤란해지는까요. 디비 설계가 좀 이상한거 같긴한데 좀 그렇습니다. 

현재는 그냥 A 테이블 내역 뽑을 때 컬럼 쪽에 그냥 B테이블의 사원이름 가져오는 쿼리가 있는 상태입니다. 그래서 데이터 건건이  B테이블을 뒤져서 사원이름을 구해오는 상태여서 쿼리가 상당히 느린상태입니다. 

이걸 개선하려고 쿼리는 수정하려고 하는데 쉽지 않네요. 


by 마농 [2020.03.02 08:08:26]

아직 발생되지 않은 막연한 가능성만으로 코드를 복잡하게 짤 필요가 있나요?
어차피 테이블 제약조건만으로는 중복 제거가 안됩니다.
테이블 제약조건만으로는 중복 가능성을 판단하지 마시고
 실제 업무 프로세스상 중복이 가능한지를 판단하셔야 합니다.
중복불가라고 한다면? 어플리케이션에서 입력시 중복체크를 강화하고 조인은 간결하게 하면 됩니다.
중복가능이라고 한다면? 조인 코드가 좀 더 복잡해 지는 수 밖에 없구요.
중복 가능하다면?
중복 자료 중 한개만 선택하는 기준이 있는 것인지?
혹시 중복 자료를 모두 보여줘야 맞는것은 아닌지?
ROW_NUMBER 를 이용하면 중복 제거는 가능합니다.

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