문제
다음 상관 서브쿼리를 일반 서브쿼리로 변환한 것으로 가장 적절한 것은?
SQLSELECT 상품명 FROM 상품 A WHERE EXISTS (SELECT 1 FROM 주문 B WHERE A.상품코드=B.상품코드 AND B.주문일자>='2024-01-01');
① SELECT 상품명 FROM 상품 WHERE 상품코드 IN (SELECT 상품코드 FROM 주문 WHERE 주문일자>='2024-01-01') ② SELECT 상품명 FROM 상품 WHERE 상품코드 = ANY (SELECT 상품코드 FROM 주문 WHERE 주문일자>='2024-01-01') ③ SELECT 상품명 FROM 상품 WHERE 상품코드 NOT IN (SELECT 상품코드 FROM 주문 WHERE 주문일자>='2024-01-01') ④ SELECT DISTINCT 상품명 FROM 상품 WHERE 상품코드 IN (SELECT DISTINCT 상품코드 FROM 주문 WHERE 주문일자>='2024-01-01')
정답
4번
해설
① 부분적으로 맞음: EXISTS를 IN으로 변환한 것은 맞지만, EXISTS는 자동으로 중복을 제거하는 반면 IN은 중복된 결과를 반환할 수 있어 완전히 동일하지 않습니다. ② 틀림: = ANY는 IN과 기능적으로 동일하지만 여전히 중복 문제가 있고, 일반적으로 사용되지 않는 표현입니다. ③ 틀림: NOT IN은 EXISTS의 반대 조건으로 완전히 다른 결과를 반환합니다. ④ 정답: EXISTS는 조건을 만족하는 행의 존재 여부만 확인하므로 자연스럽게 중복이 제거됩니다. 따라서 정확한 변환을 위해서는 DISTINCT를 사용하여 중복을 제거해야 하며, 서브쿼리에서도 DISTINCT를 사용하여 성능을 최적화할 수 있습니다.