2개의 쿼리문에서 총 count가 왜 다를까요? 9 633

by 물개 [SQL Query] [2014.09.28 16:45:48]


1안.  

select count(*)    --2000건
from (

        select id, min(type) type
        from(
                select id, '2' as type
                  from school
                  where country = 'ko'
                 union all
                 select id, '1' as type
                   from school
                   where useEn = 'Y'
            )
        group by id
    )
    
2안.
select count(*)     -- 2200건
from (
        select id, userEn, country, decode(useEn, 'Y', '1', decode(country, 'ko', '2', '0')) as type
            from school
           where userEn = 'Y'   --조건문 질문시에 누락했네요;;
                or country = 'ko'          

    )

 

속도차이는 잘 모르겠지만

1안으로 구성되어 있는 것(union all)을 한 번(union all 없이)으로 구성해보고 싶어서

고민끝에 decode 문을 써서 구성을 했는데요.

출력 결과가 다르게 나타나서 해결이 안되었습니다.

 

[질문1] 위의 쿼리 2안은  무엇이 문제이고

[질문2] 1안을 간결하고 나은 성능으로 작성하려면 어느 방식으로 구성하는 것이 좋은지 조언 부탁드립니다.

 

읽어주셔서 감사합니다.

by 비주류 [2014.09.28 22:38:56]

country = 'ko' 로 나온 결과와 useEn = 'Y' 나온 결과 합치면 전체와 같나요?
2안 조건에 country = 'ko' OR useEn = 'Y' 넣어보세요.


by 우리집아찌 [2014.09.29 08:57:47]

2번째는 count 가 아니라 SUM 하셔야하겠는데요..


by 아발란체 [2014.09.29 09:30:31]

= ㅅ =);; 저 정도면 쿼리가 완전 다른 것 같은데..

디코드 문도 결과 차이가 발생하고, 그룹바이 절도 결과 차이가 발생 할 것 같습니다.


by 손님 [2014.09.29 09:43:21]
2안 조건에 country = 'ko' OR useEn = 'Y' 넣고해도 동일하지가 않네요
위 쿼리문에 빠진 조건입니다
모두 답변 달아주셔서 감사합니다

by 물개 [2014.09.29 09:55:59]
2안 type에 sum 걸고 group by id 를 추가하니 결과가 동일하네요 왜 그런 결과가 ㅠ 실행시간도 빠르고 좋네요
감사합니다

by 우리집아찌 [2014.09.29 11:11:05]

2번째 쿼리에서 COUNT 하시면 DECODE한 의미가 없습니다. 그냥 전체 row 를 count 해옵니다.


by 마농 [2014.09.29 11:38:59]

결과만 맞게 나왔다고 그냥 넘어가시면 안됩니다.
왜 그런지를 이해하고 넘어가야죠.


두 쿼리의 차이점은 두가지 입니다.
하나는 조건이 있냐 없냐의 차이이고
하나는 그룹바이를 했느냐 안했느냐 차이가 있습니다.
ID 가 유니크 하다면 조건절만 추가하면 그룹바이와 상관 없이 건수는 맞아야 합니다.
그런데 건수가 틀리다는 얘기는 중복 ID 가 있다는 말이죠.


count 대신 sum 을 한것은 무슨 의도일까요?
잘못된 시도를 한 것 같습니다.
sum 을 했는데 count 와 같은 결과가 나왔다면?
우연의 일치로 1 값만 존재하고 2 값은 없다는 거겠네요.


by 우리집아찌 [2014.09.29 13:22:29]

아 .. 쿼리 대충보고 답글달았더니.. 그렇네요..


by 물개 [2014.09.30 22:32:33]

답변 감사합니다.

저도 생각해보니 id 값이 유니크가 아니었나 라는 생각을 해봤는데

 

이런 경우에 id가 2건씩 있는 값을 조회하는 쿼리문을 어찌 돌려봐야 할지 고민해봐야겠습니다.

 

감사합니다.