(쿼리? 방향? 질문) 저의 고민이 점점 깊어지고 있어요.. 0 1 606

by MISSO [SQL Query] [2018.01.09 17:28:21]


안녕하세요? 고갱님의 요청으로 고민하다가 도저히 답이 안나와서 이렇게 QNA를 올립니다~

기존 테이블 TB1이 있습니다. TB1의 PK는 TB_CODE 컬럼으로 코드 마스터 값와 부수적인 데이터들이 존재합니다.

고객의 요구사항은 TB1의 데이터를 창고별로 분리해서 보고 싶다는겁니다.

또한 운영쪽 입장은 그럼 WH_CD 컬럼을 PK로 추가하되 (*)이라는 개념을 가져가자!

WH_CD가 '*'인 데이터는 창고 구분 없이 시스템에서 기본으로 사용하는 Default TB_CODE 이다.

그 외 추가되는 TB_CODE의 데이터는 무조건 WH_CD컬럼에 창고 코드 실제 값(ex:WH01, WH02..)이 들어간다.

이렇게 되면 사용자가 조회를 했을때 TB_CODE 값 기준으로 창고 코드가 등록된 데이터를 우선, 그 다음 * 로만 존재하는 데이터가 나와야 합니다.(동일한 TB_CODE 값이 존재할 경우 창고코드가 등록된 데이터 기준으로 보여줌)

예를들어

TB_CODE(AS-IS)    |    WH_CD    TB_CODE(TO-BE)

CD1                         WH01       CD1

CD2                         *              CD1

CD3                         *              CD2

CD4                         *              CD3

CD5                         *              CD4

                               *              CD5

 

리스트 조회 결과가 아래와 같이 나와야 합니다.

TB_CODE(Result)

WH01       CD1

 *              CD2

 *              CD3

 *              CD4

 *              CD5

그래서 기존에 TB_CODE 테이블을 조인하고 있는 쿼리 수십개의 조건절에 WH_CD(추가될 컬럼)를 추가해야 하는데요, 보다 효율적이고 명시적이며 영향을 덜 받는 방향으로 고민을... 답이 없더라고요 ㅠㅠ

저의 고민들은 이렇습니다...

1) 수십개의 쿼리 조건절에 일일이 WH_CD = (WH_CD가 존재하는 경우는 WH_CD 리턴, 없는 경우는 '*' 리턴)

 SELECT * FROM TB AA

WHERE AA.WH_CD = NVL((SELECT WH_TB.WH_CD FROM TB WH_TB

                                    WHERE WH_TB.WH_CD = 'WH01'

                                       AND WH_TB.TB_CODE = AA.TB_CODE), '*')   <--파란색 부분이 추가(쿼리의 경우에 따라 조금씩 차이는 남)

   AND AA.TB_CODE = 'TB_CODE VALUE' ;

 위와 같이 구현을 할 경우는 개발 공수도 들어가고 개발자가 현재 테이블의 변경된 내용을 모를 경우(동일 TB_CODE에 2개 이상의 데이터가 존재할 수 있다. 즉, ALL(*)개념을 인지하지 못한) 단순 WH_CD, STRG_CD 값만 조건절에 추가하여 결과 값이 잘못될 수 있을것 같습니다. (제가 생각해도.. *이 뭐야? 라고 할듯...)

그래서 차라리 개발자들이 한번 더 확인할 수 있게 WH_CD = DB펑션(WH_CD, TB_CODE)로 수정할까? --> 그래도 아예 처음부터 TB만 보고 개발한다면 관련된 DB펑션이 있는지 없는지 모를것 같습니다..

 

단순히 고객의 요구사항만 만족하자면 WH_CD만 TB_CODE별로 한벌씩 추가되면 끝나는데(개발자 입장에서도 명확함) 운영쪽 데이터 관리에 있어서 요구사항까지 결합하자니..WH_CD가 * 또는 창고코드로 관리하니 생각이 점점 길어지네요...

 

만약 저와 같은 요구사항을 받으셨다면 어떻게 하시겠습니까?(안해요... 안된다고 하세요... 이런거 말고요 ㅠㅠ)

1) 어떻게하면 개발자들이 명확하게 *의 존재를 알 수 있고

2) 개발 공수도 덜 들며(알알이 추가하는 방법 말고..예를 들어 SQL 공통부분만 따로 파일 떼서 include하는 방식?)

3) 퍼포먼스 면에서도(창고코드별 코드가 존재하지 않는다면 '*' 이 부분..쿼리) 영향도가 덜할지..

유경험자분이 계시다면 첨언 간절히 부탁드리겠습니다.

 

 

 

by 마농 [2018.01.09 17:56:36]

창고코드(wh_cd)만 유니크하게 관리하는 테이블은 따로 없나요?
그거랑 조인해서 창고별 코드가 모조리 나오는 뷰를 만들어 개발자에게 제공하면 될 것 같아요.

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