본문 바로가기
SQL/MSSQL

[MSSQL] IN절을 사용해 데이터 출력하기 - 잘못된 사용자 데이터 추출

by kkaboo 2023. 10. 27.
728x90

전체 데이터 중 특정 정보(데이터)가 입력되지 않은 데이터만을 출력하는 일을 받았다.
고객사의 IT 관리자가 필요한 사용자정보를 입력하지 않은 사용자들을 파악해 관리하기 위함이었다. 
메인화면의 카드를 통해 해당 페이지에 들어가게 되면 전체 사용자 정보 중에서 필요한 사용자 정보를 입력하지 않은 데이터만 출력하는 방식이다.
페이지를 새로 제작하는 것이 아니라 조건에 따라 보이는 데이터를 변경해줘야 했고, 기존 화면에 존재하는 데이터들은 영역별/그리드 별로 쿼리를 따로 불러와 출력하는 상황이었기 때문에 고민을 많이 했다.

우선 필요한 사용자 정보를 입력하지 않은 데이터(이하 에러 데이터)를 가져오는 조건을 부여하기 위해 검색조건에 errorYn이라는 필드를 추가했다.
카드를 클릭해서 해당 페이지에 접근하게 되면 errorYn의 값이 Y로 변경되면서 원하는 쿼리를 실행시키기 위해서다.
<if test='errorYn != null and errorYn != "" and "Y".equals(errorYn)' ></if>로 실행 조건을 설정했다.

쿼리는 조회 조건이기 때문에 WHERE절에서 IN절을 사용하기로 했다. 앞서 말했듯이 기존 화면에 존재하는 데이터들은 상이한 쿼리를 불러와 출력하고 있었기때문에 모든 조건을 만족시키기 위해 IN절 안에서 JOIN을 해주어야 했다.

그 결과 생성된 IN절이다
 

<if test='errorYn != null and errorYn != "" and "Y".equals(errorYn)' >
    AND A.USER_ID IN (
                      SELECT DISTINCT X.USER_ID
                        FROM (
                              SELECT US.USER_ID, PT.COMPANY_CD, PT.PLANT_CD
                                FROM M_USER US
                               CROSS JOIN M_PLANT PT
                               WHERE 1 = 1
                                 AND US.COMPANY_CD = PT.COMPANY_CD
                                 AND US.USE_YN = 'Y'
                                 AND US.DEL_YN = 'N'
                                 AND PT.USE_YN = 'Y'
                                 AND PT.DEL_YN = 'N'
                              ) X
                              LEFT JOIN M_USER_COMPANY Y
                                     ON X.USER_ID = Y.USER_ID
                                    AND X.COMPANY_CD = Y.COMPANY_CD
                                    AND X.PLANT_CD = Y.PLANT_CD
                                    AND Y.USE_YN = 'Y'
                                    AND Y.DEL_YN = 'N'
                                  WHERE 1 = 1
                                    AND Y.SERIALKEY IS NULL
                                  UNION
                                 SELECT US.USER_ID
                                   FROM M_USER US
                                  WHERE 1 = 1
                                    AND (US.COMPANY_CD = '' OR US.PLANT_CD = '')
                                    AND US.USE_YN = 'Y'
                                    AND US.DEL_YN = 'N'
                     )
</if>

 
errorYn이 'Y'이라는 조건을 만족하면 전체 SELECT 쿼리에서 위의 쿼리조건에 만족하는 데이터만 출력된다.
 
 
이번 일은 쿼리짜는데에도 고민을 많이 했지만, 가장 효율적인 선에서 기존 데이터와 에러데이터의 구분을 직관적으로 사용자들에게 표현하는 방법을 생각하는데에도 꽤 시간이 걸렸다.
 

MSSQL - IN절

SELECT 
      * 
  FROM 테이블명
 WHERE 
 컬럼명 IN ( 조건 )
728x90