마스터 테이블을 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테이블컬럼) 을 넣었더니, 원하는 결과가 나왔다!!!!
'웹앱프로젝트 > Mysql' 카테고리의 다른 글
[오라클] 오라클에서 limit ( rownum 범위(between)로 검색) (0) | 2022.09.07 |
---|---|
[오라클] 조회 순번 매기는 방법(rownum, row번호 출력), 조건별로 그룹 조회 방법(group by) (0) | 2022.09.06 |
LEFT OUTER JOIN 한 쪽 테이블에 없어도 join해서 null로 보여줌 (0) | 2022.07.14 |
다른 테이블과의 비교를 통한 update 문 (mysql) (0) | 2022.07.11 |
HeidiSQL 에서 데이터베이스 생성, 테이블 생성 (0) | 2022.07.01 |