DS가 되기 위한 여정 👩‍💻

Data Science/SQL

[Elice sql] 서브쿼리에서는 on 아니고 where로 조건 줄 것. exists 사용이 더 나음.

Tashapark 2025. 3. 13. 11:38
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
반응형