스칼라 서브쿼리 한뎁스안에서 Order By는 불가능한가요? 5

by 손님 [SQL Query] [2010.07.12 21:46:09]



그 왜 스칼라 서브쿼리라고 하던데..
select
   (
select cd
from  b
    )
from a 

요런식으로 쓰는것 말인데요.
저기 from b 밑에 order by 줄경우 우괄호가 안닫혔다는 에러가 나네요. 빼면 잘되구요
왜그런지 이유도모르겠구.. 방법좀알려주세요 ^^;;

p.x) 스칼라서브쿼리 대신에 인라인서브쿼리(where절에쓰는거)가 더좋은건가요?
   선임이 그런예길 해서요 ^^;
by 마농 [2010.07.13 08:01:03]
우선 에러가 나기 이전에 order by 가 필요한 것인지 고민해 보세요.
스칼라서브쿼리란 1 row 1 column 을 반환하는 쿼리입니다.
정렬은 아무런 의미가 없습니다.

스칼라서브쿼리 대신에 인라인서브쿼리(where절에쓰는거)가 더좋은건가요?
==> 단순 비교는 불가능합니다. 그건 상황에 따라 다릅니다.
어떤 경우에 어떤걸 써야 좋은지를 이해하셔야 합니다.
그 경우란 것이 너무 다양한 것이라 댓글로 일일이 설명드리긴 어렵고
반대로 님께서 처하신 상황을 설명하시면 그에 알맞은 쿼리를 만들어 드릴수는 있습니다.

by 마농님 [2010.07.13 09:22:19]
아 제상황이.. 1row 1column값을 가져오려는건 맞는데
검색시 여러 row가 나오는데 그중 order by를 거쳐 rownum=1의 값을 가져오려고 하거든요..
그런데 order by 가 안먹히네요 ㅜㅜ

by 마농 [2010.07.13 09:34:47]
다음과 같이 rownum과 order by를 같이 사용하는 방법은 어차피 틀린 방법입니다.
where rownum = 1
order by a

올바른 사용법은 다음과 같이 order by 먼저 한 후 rownum 해야만 합니다.
from (select .. order by a)
where rownum = 1

하지만 스칼라 서브쿼리에서 이와 같이 한다면 메인테이블의 컬럼이 서브쿼리의 서브쿼리로 침투하여 조건으로 사용될수는 없습니다.

조회조건컬럼과 정렬조건컬럼으로 된 복합인덱스가 존재한다면
인덱스 역스캔을 통해 한건만 가져온다면 order by 도 필요없고, 또 한번의 서브쿼리도 필요없고 성능도 향상될 수 있습니다.

by 마농님 [2010.07.13 10:32:42]
아 정말 마농님답변은.. 단순 해결 방법뿐만 아니라
확실히 이해시켜주시네요 ㅠㅠ
정말 여기와서 여쭤볼때마다 답변들은것은 항상 중요한부분이라 메모로 남기곤해요
감사합니다.!

by 박광서 [2013.02.13 11:06:51]
아래처럼 with 절을 사용해 보시면 어떨까요?

select a,b,c,
        (with V as (select a, d
                    from B
                    order by d desc)
         select d
         from V
         where V.a = A.a
         and rownum = 1) as d
from A

여기서 성능을 위해 B.a 열엔 인덱스가 있어야 겠습니다.~~
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입