인프런 커뮤니티 질문&답변

bluebamus님의 프로필 이미지
bluebamus

작성한 질문수

데이터 분석 SQL Fundamentals

스칼라 서브쿼리 실습 - 01

스칼라 서브쿼리에 질문이 있습니다.

작성

·

435

·

수정됨

0

-- 아래는 수행 오류 발생. 스칼라 서브쿼리는 단 한개의 결과 값만 반환해야 함.

select a.*

, (select ename from hr.emp x where x.deptno=a.deptno) as ename

from hr.dept a;

 

위의 테스트 결과가 에러가 나오는데

 

select ename from hr.emp x, hr.dept a where x.deptno=a.deptno

 

서브쿼리만 따로 출력해 보면 ename에 대한 하나의 컬럼 값만 나옵니다.

 

아무리 생각해도 1개 이상의 row나 1개 이상의 컬럼이 서브쿼리에서 반환되지 않고 모든 ename은 하나의 값만 가지고 있는걸 확인했는데, 왜 에러가 발생하는 것인지 잘 모르겠습니다.

답변 1

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

스칼라 서브쿼리는 메인 쿼리의 한개의 row 마다 단 하나의 row 결과 값을 반환해야 합니다.

메인 쿼리 from 테이블인 dept는 1개의 deptno 마다 여러개의 emp row 결과 값을 가지게 됩니다(dept와 emp는 deptno 로 1:m 입니다). 따라서 해당 스칼라 서브쿼리는 오류가 발생합니다.

예를 들어 메인 쿼리의 deptno가 10인 경우를 수행하면(즉 a.deptno=10) 아래 스칼라 서브쿼리는 여러개의 레코드를 반환하게 되어서 수행되지 않습니다.

select ename from hr.emp x where x.deptno=10

 

감사합니다.

bluebamus님의 프로필 이미지
bluebamus
질문자

제가 이해가 부족하여 질문을 더 드려봅니다.

혹시나 하여 select x.deptno , count(*) as cnt from hr.emp x group by x.deptno;

쿼리를 실행하니

image

이와 같은 결과가 나왔습니다.

스칼라 서브쿼리는 where의 join으로 들어가는 메인쿼리의 수와

반환되는 데이터의 수가 1:1이 되어야 하는지요?

만약 위와 같은 상황에서 10,20,30의 deptno가 있으니 반환도 3개가 되어야지

그 이상의 수가 되면 에러가 되는건가요?

1개 이상의 row나 1개 이상의 컬럼이라고 수업시간에 알려주셔서

그렇게 이해를 했는데 지금 현상에 대해서는 도무지 감을 잡질 못하겠습니다.

 

 

 

권 철민님의 프로필 이미지
권 철민
지식공유자

음, 추가 질문을 잘 이해하지 못했습니다만,

스칼라 서브쿼리는 그냥 서브 쿼리와 비슷합니다. 다만 서브 쿼리는 select절에 사용하지 못하는 것과, 강제로 1의 집합으로 만드는게 스칼라 서브쿼리와 차이가 있습니다. 스칼라 서브쿼리는 메인 집합의 개별 레코드와 연결된 결과가 단 한건의 레코드가 아니면 오류가 발생합니다.

그러니까 아래 SQL에서 from 절의 hr.dept가 메인 쿼리라고 하면,

select a.*

, (select ename from hr.emp x where x.deptno=a.deptno) as ename

from hr.dept a;

서브쿼리 select ename from hr.emp x where x.deptno=a.deptno 에서

메인 쿼리의 dept 개별 레코드와 서브쿼리의 emp의 데이터가 x.deptno=a.deptno로 연결이 되는데, 메인 쿼리 1개 레코드당 서브쿼리의 연결결과가 여러건이 나오게 되어서 오류가 발생합니다.

이전 답변에서도 말씀 드렸듯이 메인 쿼리 dept 집합의 레코드 한건 즉 deptno가 10인 레코드를 액세스하게 되면 스칼라 서브쿼리 select ename from hr.emp x where x.deptno=10 는 여러건을(3건)을 반환하게 됩니다. 그래서 오류가 발생합니다.

차근차근 dept 집합을 먼저 액세스 한 다음에 이걸 기반으로 스칼라 서브 쿼리 emp 집합을 액세스 해보시면 좋을 것 같습니다. 다시 말씀 드리면 메인쿼리 dept는 총 3건인데, 만약에 스칼라 서브쿼리의 결과가 여러 건이 나오게 될 때 오류를 발생 시키지 않으면 결론적으로 메인 쿼리 데이터 3건 보다 더 많은 건수가 나오게 됩니다. 스칼라 서브쿼리는 이런 결과를 허용하지 않습니다.

 

bluebamus님의 프로필 이미지
bluebamus
질문자

서브쿼리에 들어가는 메인 쿼리 1개의 레코드당

반환되는 레코드는 1개가 되어야 한다.

현재 처리되고 있는 메인 쿼리 1개의 레코드에 대해

여러개의 반환되는 레코드가 있다면,

-- 입력 레코드 1개, 반환되는 서브쿼리 값 3개

ex) 메인쿼리 레코드 : product_id (100) = 서브쿼리 반환 값 : product_id (100,100,100)

스칼라 서브쿼리의 처리는 에러가 된다.

제대로 된 처리가 되기 위해서는

ex) 메인쿼리 레코드 : product_id (100) = 서브쿼리 반환 값 : product_id (100)

이렇게 1개 레코드 당 1개 반환값 형식의 데이터 접근과, 반환이 이루어져야 한다.

이렇게 이해를 하면 될까요?

권 철민님의 프로필 이미지
권 철민
지식공유자

네, 맞습니다.

서브쿼리와 마찬가지로 스칼라 서브쿼리 역시 메인 쿼리 집합을 변화 시켜서는 안됩니다.

bluebamus님의 프로필 이미지
bluebamus

작성한 질문수

질문하기