개인사정으로 질문내용 삭제합니다 죄송합니다 0 8 1,280

by 될때까지 [Oracle 기초] [2013.08.21 08:41:58]


개인사정으로 질문내용 삭제합니다 죄송합니다

by 아발란체 [2013.08.21 10:10:36]

답변은 아니지만,
특별한 경우가 아니면 잘 쓰지 않는 것 같습니다.

쓰지 않고도 원하는 정렬을 대부분 구할 수 있으며
오더절에 질의를 쓰면 타 DBMS로 변경 되었을 때 실행이 되지 않을 수 있습니다.

주의는 해당 질의 결과가 1건 이상 출력이 되면 오류가 나기 때문에
1건 이상이 출력 되어야 한다면 본(Body) 질의 결과와 1:1로 매핑 되어야 합니다.

SELECT USER_ID, NAME, ADDR FROM MEMBER
   ORDER BY (SELECT MAX(USER_ID) FROM MEMBER_DETAIL WHERE USER_ID = MEMBER.USER_ID)

SELECT USER_ID, NAME, ADDR FROM MEMBER
ORDER BY (SELECT 1 FROM DUAL UNION ALL SELECT 2 FROM DUAL)

>> ERROR : 단일 행 하위 질의에 2개 이상의 행이 리턴 되었습니다.


by 손님 [2013.08.21 10:16:34]

감사합니다
제가 생초보라 조금 이해가 힘든 부분이 있는데,
'주의는 해당 질의 결과가 1건 이상 출력이 되면 오류가 나기 때문에
1건 이상이 출력 되어야 한다면 본(Body) 질의 결과와 1:1로 매핑 되어야 합니다.'
라고 말씀하신 부분을 제가 이해하기로는...
order by에 서브쿼리를 사용한다면 정렬해서 모두 표시해주는 것은 불가능하고 max나 min 처럼 정렬 후 하나의 값만 나타낼 수 있다는 건가요?
잘못이해한 거라면 조금만 풀어서 설명부탁드립니다


by 될때까지 [2013.08.21 10:17:17]

에고 로그인을 안해서 손님으로 댓글이 달렸네요 죄송합니다
그리고 본 질의 결과와 1:1로 매핑되어야 한다는 부분도 조금 헷갈립니다
메인쿼리와 1:1로 조인되거나 관계를 가져야 한다는 말씀이신가요?
작성해주신 쿼리내용 차분히 살펴보니 정렬은 가능한데 서브쿼리를 통한 조건을 딱 하나만 지정해줘야 한다는 것 같네요 제대로 이해한 것이 맞나요?
'SELECT USER_ID, NAME, ADDR FROM MEMBER
   ORDER BY (SELECT MAX(USER_ID) FROM MEMBER_DETAIL WHERE USER_ID = MEMBER.USER_ID)'
을 user_id 컬럼을 가장 큰 값을 기준으로 정렬해라 로 이해했습니다


by 마농 [2013.08.21 10:58:40]
정렬은 쿼리의 맨 마지막에 수행됩니다.
정렬만 빼면 Select 절이 제일 마지막이구요.
정렬에 올수 있는 항목은 Select 절에 올수 있는 항목이라 생각하시면 됩니다.
반대로 말하면 Select 절에 올 수 없는 항목은 Order By 절에도 올 수 없죠.
Select 절에 서브쿼리 쓰듯이 Order By 절에 서브쿼리 사용 가능합니다.
select절의 서브쿼리는 스칼라서브쿼리(단일값)만 가능합니다.
이해를 돕기 위한 예제들...
SELECT 1, (SELECT 1 FROM dual) a
  FROM dual
 ORDER BY (SELECT 1 FROM dual)
;
SELECT 1, (SELECT 1 FROM dual) a
  FROM dual
 ORDER BY a -- Select절의 알리아스를 이용한 정렬
;
SELECT 1 a
  FROM dual
 ORDER BY (SELECT 1 FROM dual)
;

by 될때까지 [2013.08.21 11:09:07]
한방에 쏙 이해가 되네요
항상 감사드립니다
너무 자주 감사인사를 드려서 행여나 감사의 마음이 제대로 전달되지 않을까 걱정이 될 정도입니다
오늘 하루도 행복한 하루 되시길 바랍니다 ^^

by 될때까지 [2013.08.21 11:16:50]
이해하다보니 궁금한 것이 생겼는데요...
그럼 select 절에 서브쿼리를 사용하나 order by 절에 서브쿼리를 사용하나 차이가 없는거 아닌가요?
그렇다면 왜? order by 절에서 서브쿼리를 사용하는건가요?
그리고 select 절에서 서브쿼리를 사용하지 않고 order by 절에서만 사용해야 하는 경우도 있는건가요?
궁금해서 검색해봤는데 역시나 서브쿼리에서 order by를 사용하는 부분에 대한 내용만 검색되네요 제가 검색능력이 미진한건지.. ㅠㅠ

by 마농 [2013.08.21 11:50:33]
조회항목과 정렬항목이 항상 일치하지는 않죠.
조회항목에 필요없는 값이 정렬항목으로 꼭 필요하다면 Order By 에만 해당 서브쿼리를 쓸 수도 있죠.

by 될때까지 [2013.08.21 12:15:06]
아하 그렇군요
감사합니다
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입