일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- JPAproxy
- OSIV
- httppie
- spring
- 데이터베이트h2
- 스프링부트기본설정
- JPA값타입
- JPA프록시
- springbootproxy
- sql
- jpqlquery
- springboot기본설정
- 임베디드타입
- jpa
- dockercmd
- embededtype
- 에이치투데이터베이스
- JDBC connection pool
- Git
- gitinitial
- 제이피큐엘쿼리
- javageneric
- MySqlType
- Open EntityManager
- 자바제너릭
- 스프링부트
- 이해와 원리
- JPA Hint & Lock
- springbootH2
- JPAmapping
- Today
- Total
빡코
[SQL] 오랜 기간 보호한 동물(1) 본문
https://programmers.co.kr/learn/courses/30/lessons/59044
출력
아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.
시도방법
1.LEFT OUTER JOIN를 이용해서 값을 뽑아내는데까지는 성공하였다. 하지만, 조건인 ' 동물 3마리의 이름과 보호 시작일을 조회'을 만족시켜야 했다. 여기까지의 쿼리문과 결과값.
SELECT ANIMAL_INS.NAME, ANIMAL_INS.DATETIME
FROM ANIMAL_INS
LEFT OUTER JOIN ANIMAL_OUTS
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
WHERE ANIMAL_OUTS.ANIMAL_ID IS NULL
ORDER BY ANIMAL_INS.DATETIME;
조건을 만족시키위해서는 name이 Benji 출력이 되어야하지만, 총 4개의 값이 출력이 되었다.
이부분에서 'ROWNUM <= 3' 이는 조건을 주면 원하는 결과값을 얻을 수 있다.
수정된 쿼리문은 아래와 같다
SELECT * FROM (
SELECT ANIMAL_INS.NAME, ANIMAL_INS.DATETIME
FROM ANIMAL_INS
LEFT OUTER JOIN ANIMAL_OUTS
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
WHERE ANIMAL_OUTS.ANIMAL_ID IS NULL
ORDER BY ANIMAL_INS.DATETIME
)
WHERE ROWNUM <= 3;
최종 출력값. 성공이다.
참조 풀이법
풀이1.
SELECT result.name,result.datetime
from(
select rownum rnum, re.name name, re.datetime datetime
from (select * from animal_ins ins
where ins.animal_id not in(select animal_id from animal_outs)
order by ins.datetime) re
)result
where result.rnum<=3;
풀이2
SELECT * FROM
(SELECT A.NAME, A.DATETIME
FROM ANIMAL_INS A LEFT JOIN ANIMAL_OUTS B
ON A.ANIMAL_ID = B.ANIMAL_ID
WHERE B.ANIMAL_ID IS NULL
ORDER BY A.DATETIME)
WHERE ROWNUM<=3
관련 개념
1.LEFT OUTER JOIN
조인 수행시 먼저 표기된 좌측 테이블에 해당하는 테이터를 먼저 읽은 후, 나중 표기된 우측 테이블에서 JOIN 대상 테이터를 읽어옵니다. 즉 Table A와 B가 있을 때 (Table A 가 기준이 됨) A와 B를 비교해서 B의 JOIN 컬럼에서 같은 값이 있을 때 해당 데이터를 가져오고, B의 JOIN 컬럼에서 같은 값이 없는 경우에는 B테이블에서 가져오는 컬럼들은 NULL 값으로 채웁니다. OUTER 키워드는 생략할 수 있습니다.
SELECT
FROM Table A
LEFT JOIN Table B
ON A.Key = B.Key
WHERE B.Key is NULL;
2. ROWNUM
ROWNUM을 사용하는 방법
1. ROWNUM 키워드 이용하는 방법
SELECT ROWNUM
, A.*
FROM SCOTT.EMP A
ORDER BY A.ENAME
SELECT ROWNUM
, X.*
FROM ( SELECT A.*
FROM SCOTT.EMP A
ORDER BY A.ENAME
) X
2. ROW_NUMBER() 함수를 사용하는 방법
SELECT ROW_NUMBER() OVER(ORDER BY A.JOB, A.ENAME) NUM
, A.*
FROM SCOTT.EMP A
ORDER BY A.JOB, A.ENAME
그룹별(PARTITION)로 순번을 따로 부여할 수 있다.
SELECT ROW_NUMBER() OVER(PARTITION BY A.JOB ORDER BY A.JOB, A.ENAME) NUM
, A.*
FROM SCOTT.EMP A
ORDER BY A.JOB, A.ENAME
참조
https://gent.tistory.com/170