전체 데이터 중 특정 정보(데이터)가 입력되지 않은 데이터만을 출력하는 일을 받았다.
고객사의 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 ( 조건 )
'SQL > MSSQL' 카테고리의 다른 글
[MSSQL]datetime타입의 컬럼에 Null값을 Insert할 때 1999-01-01이 들어가는 현상과 해결법 (2) | 2024.01.10 |
---|---|
[MSSQL] ISNULL과 NULLIF (0) | 2024.01.06 |