728x90
반응형
수정 전
- 이게 1개 이상이 출력된다는데
수정 지점을 잘 모르겠다..
확실히 많이 풀어봐야 되는 것 같다.
select j.coin_ticker, j.price
from JAPAN_EXCHANGE j
join KOREA_EXCHANGE k on k.coin_ticker = j.coin_ticker
where j.price >= (
select price
from KOREA_EXCHANGE
)
order by j.coin_ticker;
수정 후
SELECT j.coin_ticker, j.price
FROM JAPAN_EXCHANGE j
WHERE j.price >= (
SELECT k.price
FROM KOREA_EXCHANGE k
WHERE k.coin_ticker = j.coin_ticker
)
ORDER BY j.coin_ticker;
- 이 부분이 계속 헷갈렸는데
- join에서 on을 하는 것은 서로 다른 테이블을 on조건으로 합치기 위한 것이고
단순한 행결합임.
- 서브쿼리에서 where절로 조건을 주는 것은 행 결합이 아닌,
특정 값만을 참조하는 것이기 때문에 독립적으로 작동됨.
위의 예시는 상관 서브쿼리(Correlated Subquery)의 형태로, 외부 쿼리와 서브쿼리 사이의 값을 연결.
=> so, join만 on 쓰고 서브쿼리 사용 시 where절로 참조 값만 조건 표현해줄 것.
수정 후 2
- 계속 틀려서 확인해 보니깐, 테이블 순서 문제가 있었음. exists로도 변경
- 기준이 한국 거래소여야 함.
-- 코인 티커가 동일한 코인에 대해서 한국 거래소 가격이 더 싸거나 같은 가격인 코인을 출력하세요.
SELECT k.coin_ticker, k.price
FROM KOREA_EXCHANGE k
WHERE exists (
SELECT 1 -- 여기서 1이든 *, k.price든 상관없음
FROM JAPAN_EXCHANGE j
WHERE k.coin_ticker = j.coin_ticker
and j.price >= k.price
)
ORDER BY k.coin_ticker;
- 또 서브쿼리로 하면 다중행은 출력이 안 되는데, 그냥 exists로 하면 다중행이 가능함.
- 그리고 어떤 값이든 써도 되는데, 1을 써서 불필요한 연산을 줄이는 것임. 그냥 있는지 여부만 확인하기 때문에
- 칼럼명을 썼으면 이를 확인해야 해서 불필요하게 연산이 필요함.
- exsits (select 1, ) -> 까먹고 있었는데 이것도 기억하자.
728x90
반응형
'Data Science > SQL' 카테고리의 다른 글
[프로그래머스 sql] count()는 null 못셈 (0) | 2025.03.20 |
---|---|
[프로그래머스 sql] 비트연산.. 너무 익숙해지지가 않음.. (0) | 2025.03.20 |
[Elice sql] cte..는 계속 헷갈림. (0) | 2025.03.13 |
[Elice SQL] full outer join을 union으로 할 때 (0) | 2025.03.12 |
[Elice sql] from 서브쿼리 별칭을 명시해야 오류 x (0) | 2025.03.11 |