도대체 이 부속질의는 뭘까요??... 0 6 629

by dkfldkfl [SQL Query] [2018.08.14 16:38:17]


B 테이블                                 C 테이블

ID NAME ADR                          ID  COST

 

요기에서 B테이블을 기본으로 보여주되 ID 에 맞는 COST 값만 붙히고 싶은 상황입니다

 

상사님 께서 이렇게 하셨습니다

SELECT *, (SELECT c.cost FROM C  as c WHERE c.ID = b.ID ) as COST

FROM B as b;

 

보통 FROM 에서 부속질의 하지 않나요? 저렇게 하면 좋은게 있나요?

 

전 저런 방식은 근데 처음 봤습니다 만약 저한테 하라고 한다면

SELECT a.*, b.cost FROM B,C WHERE b.id = c.id 이렇게 할텐데 말이죠

 

B테이블에서 C의 cost 값만 추가 하고 싶은건 맞습니다

 

하나의 컬럼만 매칭해서 추가하는 건데 사실 JOIN 을 할필요가 있는지 궁금하기도 합니다

 

이런 상황에서 어느게 더 좋을까요?

 

 

by 우리집아찌 [2018.08.14 16:50:41]

보통 JOIN해서 가져오는것을 추천합니다.

위의 쿼리에서 ID가 PK이고 WHERE B.ID = '1' 이런 조건이 하나 더 들어오면

한건만 반환하고 서브쿼리도 한번만 사용되겠죠

하지만 많은 데이터를 리턴할경우 서브쿼리가 여러번 호출되면서 효율이 떨어지게 됩니다.

 


by dkfldkfl [2018.08.14 16:52:34]

저 위에 방식은 저 정말 듣도 보도 못한 방법인데 예전엔 저렇게 사용했었나요?

 


by 우리집아찌 [2018.08.14 17:01:21]

보통 저렇게 사용하는걸 스칼라 서브 쿼리라 합니다.

http://wiki.gurubee.net/pages/viewpage.action?pageId=26744146


by 우리집아찌 [2018.08.14 17:03:40]

아 그리고 스칼라 서브쿼리에서 두행이상 반환되면 에러납니다. 1:1 관계가 아니면 MAX , MIN , LIMIT 등이 사용되겠죠


by 신이만든지기 [2018.08.16 19:46:00]

스칼라뷰에서 조회되는 데이터가 null 일 수 있으므로, 이너조인하게되면 결과가 다르게 나올 수 있습니다.

아우터조인해야 결과가 동일해 집니다.

예) SELECT *, (SELECT c.cost FROM C  as c WHERE c.ID = b.ID ) as COST FROM B as b;

=> select b.*, c.cost from b, c where b.id = c.id(+)

 


by 마농 [2018.08.17 08:07:09]

스칼라서브쿼리입니다.
조인의 경우 아우터 조인을 하셔야 합니다.
각각 장단점이 있습니다.
스칼라서브쿼리는 캐싱 효과가 있어 메인쿼리 집합에 중복된 ID 가 많을 경우 효과적입니다.
예를 들면 코드에서 코드명칭 가져오는 경우 스칼라서브쿼리를 사용할 만 합니다.
중복된 ID 가 적거나 아예 중복이 없는 경우라면 오히려 비효율입니다.
중복된 ID 가 적은 경우라면 조인이 유리합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입