쿼리질문드립니다~! 0 4 141

by 뜨디 [MySQL] [2022.01.14 18:10:22]


-----as - is
select
    OD_NO ,
    OD_PRGS_STEP_CD ,
    ERR_LOG_CNTS ,
    REG_DTTM
from
    OM_OD_CNTN_STAT_HST
where
    OD_NO in (
    select
        OD_NO
    from
        OM_OD_DTL
    where
        OD_NO between '20211022' and '20211023'
        and OD_CNTN_PRGS_STAT_CD = '90'
        and OD_TYP_CD = '10'
        and TR_GRP_CD = 'LI' )
    and (API_ID = 'OP_IF_0001'
    or API_ID = 'OP_API_0002')
    and instr(left(ERR_LOG_CNTS, 35), '정상') = 0;

 

 

----to - be

SELECT 
    A.OD_NO, 
    A.OD_PRGS_STEP_CD ,
    A.ERR_LOG_CNTS ,
    A.REG_DTTM
from
    OM_OD_CNTN_STAT_HST A join OM_OD_DTL B on A.OD_NO=B.OD_NO
where B.OD_NO between '20211022' and '20211023'
        and B.OD_CNTN_PRGS_STAT_CD = '90'
        and B.OD_TYP_CD = '10'
        and B.TR_GRP_CD = 'LI' 
    and (A.API_ID = 'OP_IF_0001' or A.API_ID = 'OP_API_0002')
    and instr(left(A.ERR_LOG_CNTS, 35), '정상') = 0;
 

in절 쿼리를 join으로 변경하였는데 데이터 건수가 다릅니다.. join으로 바꾼흐 데이터가 더 나오는데 이럴경우가 있을까요?

 

by 뉴비디비 [2022.01.15 19:11:25]
-- 테이블 관계가 1:N 이면 조인 관계만큼 늘어나니까 건 수 맞춰야 하면 그룹핑 같은 추가 작업이 필요할꺼예요 

-- WHERE IN 1 건 
SELECT  A.OD_NO 
FROM ( SELECT 1 AS OD_NO ) A 
WHERE OD_NO IN ( 
	SELECT OD_NO FROM (
		SELECT 1 OD_NO , 1 TR_GRP_CD UNION ALL 
		SELECT 1 OD_NO , 2 TR_GRP_CD 
	) B
)

-- JOIN ON 2 건
SELECT  A.OD_NO -- , B.OD_NO, B.TR_GRP_CD
FROM  ( SELECT 1 AS OD_NO ) A 
JOIN (
	SELECT 1 OD_NO , 1 TR_GRP_CD UNION ALL 
	SELECT 1 OD_NO , 2 TR_GRP_CD 
) B	
	ON A.OD_NO = B.OD_NO

 


by 뜨디 [2022.01.18 10:59:11]

감사합니다 :)


by 마농 [2022.01.17 10:16:52]

1. (1 : 다) 관계에서
- (다) 건을 IN 절에 넣어도 (1) 의 자료는 변화가 없습니다.
- 조인으로 바꾼다면? (1) 의 자료가 (다)건으로 중복되어 나오게 됩니다.
2. 조인으로 풀려면
- DISTINCT 한 후에 조인하거나
- 조인 후에 DISTINCT 또는 GROUP BY 하거나
3. 다른 방법으로는
- EXISTS 쿼리가 있습니다.


by 뜨디 [2022.01.18 10:59:25]

항상 감사합니다 :)

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