안녕하세요 쿼리 질문드리고 싶은게 있어 글 작성합니다!
<학생>
학생id | 학생명 |
1 | 홍길동 |
2 | 임꺽정 |
3 | 장길산 |
<도서예약>
도서예약id | 예약id | 학생id | 도서id | 예약상태 |
1 | 1 | 1 | 1 | 예약완료 |
2 | 1 | 1 | 2 | 예약대기 |
3 | 2 | 2 | 3 | 예약완료 |
4 | 2 | 2 | 4 | 예약완료 |
궁금한 것은 현재 <도서예약> 테이블에서 예약id로 묶여있는 도서ID의 상태가 모두 예약완료인 리스트만 SELECT로 추출하는게 궁금합니다.
결과는 도서예약ID에서 1,2 번을 제외한 3,4번만 출력됩니다!
쉽게 설명하면 모든 상태가 완료인 리스트를 어떻게 불러오는지 잘 모르겠습니다ㅠㅠ
항상 여기서 도움을 많이 받지만 뭔가 쉽게 감이 잡히지가 않네요
감사합니다.
WITH 도서예약 AS ( SELECT 1 도서예약id, 1 예약id, 1 학생id, 1 도서id, '예약완료' 예약상태 UNION ALL SELECT 2, 1, 1, 2, '예약대기' UNION ALL SELECT 3, 2, 2, 3, '예약완료' UNION ALL SELECT 4, 2, 2, 4, '예약완료' ) -- 1. 분석함수 -- SELECT * FROM (SELECT 도서예약id, 예약id, 학생id, 도서id, 예약상태 , COUNT(*) OVER(PARTITION BY 예약id) cnt1 , COUNT(CASE 예약상태 WHEN '예약완료' THEN 1 END) OVER(PARTITION BY 예약id) cnt2 FROM 도서예약 ) a WHERE cnt1 = cnt2 ; -- 2. Self Join SELECT a.* FROM 도서예약 a LEFT OUTER JOIN 도서예약 b ON a.예약id = b.예약id AND b.예약상태 != '예약완료' WHERE a.예약상태 = '예약완료' AND b.예약상태 IS NULL ;