웹앱프로젝트/Mysql
마스터 테이블엔 있고, 서브 테이블에 없는 row count 하는 방법 (right outer join, group by, count(컬럼명) 이용)
Minah Park
2022. 12. 9. 13:01
반응형
마스터 테이블을 A라고 한다면,
SN 과 ROTN 을 PK 로 가지고 있고, 다른 컬럼들이 존재한다고 하자. 이 컬럼들을 서브 테이블이 FK로 가지고 있다.
서브테이블을 B라고 한다면,
B테이블은 A테이블의 SN과 ROTN 컬럼을 참조하고있다.
하지만, A 테이블에는 있고, B테이블에는 없는 경우가 있다.
내가 원하는 결과는 B에 있으면 있는 row의 카운트를. 없으면 0 이라고 나오는걸 원했다.
처음에는 inner join 을 이용했는데. 생각해보니 그렇게 한다는건, 가정이 on 에 넣은 컬럼들이 A테이블, B테이블에 일치한 것만 가져오기 때문에. 만약 B 테이블에 없는 값을 조회한다면 count가 0이 아닌, NULL 이 나올 것이다.
오류 쿼리! (INNER JOIN)
SELECT
if(COUNT(1) >= d.NOPE, 'UNAVAILABLE', 'AVAILABLE') AS availableCheck,
a.SN,
a.ROTN
FROM
info AS a
INNER join
dtl AS d
ON a.SN=d.SN AND a.ROTN=d.ROTN
GROUP BY a.SN, a.ROTN, d.NOPE
이렇게 했을 때, 두 테이블에 모두 존재하는 애들만 조회가 되었다. 하지만 나는 모든 A에 있는 데이터에 대한 B 테이블 결과를 보고싶은거다!
수정한 쿼리!! (RIGHT OUTER JOIN, count(컬럼명))
SELECT
if(COUNT(a.SN) >= d.NOPE, 'UNAVAILABLE', 'AVAILABLE') AS availableCheck,
d.SN,
d.ROTN,
d.NOPE
FROM
info AS a
RIGHT OUTER join
dtl AS d
ON a.SN=d.SN AND a.ROTN=d.ROTN
GROUP BY a.SN, a.ROTN, d.NOPE
info (B테이블) 에 없어도 나올 수 있도록, RIGHT OUTER JOIN 을 사용하였고, GROUP BY 는 같다.
여기서 주목할 것은, COUNT 함수에 B테이블에 몇개 있는지를 알고 싶은 것이기때문에, 보통은 count(1) 이렇게 넣어서 항상 생각햇는데, 그건 나의 너무 좁은 생각이었던거다! 왜 컬럼을 넣을 생각을 못했을까.
아무튼, 그래서 COUNT(B테이블컬럼) 을 넣었더니, 원하는 결과가 나왔다!!!!
반응형