alias사용법 좀 알려주세요~ ^^ 0 6 2,359

by 완전초짜 [2012.05.15 09:25:07]



WITH student AS
(
    SELECT '001' s_id, '기민용' s_nm FROM dual
    UNION ALL SELECT '002', '이현석' FROM dual
    UNION ALL SELECT '003', '김정식' FROM dual
    UNION ALL SELECT '004', '강정식' FROM dual
)
, course AS
(
    SELECT '001' c_id, 'Database' c_nm FROM dual
    UNION ALL SELECT '002', 'Java' FROM dual
)
, study AS
(
    SELECT '001' s_id, '001' c_id, 1 chasu FROM dual
    UNION ALL SELECT '001', '001', 3 FROM dual
    UNION ALL SELECT '001', '002', 2 FROM dual
    UNION ALL SELECT '002', '001', 1 FROM dual
    UNION ALL SELECT '002', '001', 2 FROM dual
    UNION ALL SELECT '002', '001', 3 FROM dual
    UNION ALL SELECT '003', '002', 1 FROM dual
    UNION ALL SELECT '003', '002', 2 FROM dual
    UNION ALL SELECT '004', '001', 1 FROM dual
)
select  case when c_id = '001' then s_id end  as "ID"
    ,case when c_id = '001' then s_nm end as "성명"
    ,c_nm as "스터디"
    ,max(chasu1)  as "1차"
    ,max(chasu2)  as "2차"
    ,max(chasu3)  as "3차"
    ,count(c_id)  as "참여횟수"
from    (
    select  a.s_id
    ,a.s_nm
    ,b.c_id
    ,b.c_nm
    ,decode(c.chasu,1,'O') chasu1
    ,decode(c.chasu,2,'O') chasu2
    ,decode(c.chasu,3,'O') chasu3
    from    student a cross join
    course b LEFT OUTER JOIN
    study  c
    on   a.s_id = c.s_id
    and b.c_id = c.c_id
    )
group by s_id,s_nm,c_id,c_nm
order by s_id,c_id

WITH student AS
(
    SELECT '001' s_id, '기민용' s_nm FROM dual
    UNION ALL SELECT '002', '이현석' FROM dual
    UNION ALL SELECT '003', '김정식' FROM dual
    UNION ALL SELECT '004', '강정식' FROM dual
)
, course AS
(
    SELECT '001' c_id, 'Database' c_nm FROM dual
    UNION ALL SELECT '002', 'Java' FROM dual
)
, study AS
(
    SELECT '001' s_id, '001' c_id, 1 chasu FROM dual
    UNION ALL SELECT '001', '001', 3 FROM dual
    UNION ALL SELECT '001', '002', 2 FROM dual
    UNION ALL SELECT '002', '001', 1 FROM dual
    UNION ALL SELECT '002', '001', 2 FROM dual
    UNION ALL SELECT '002', '001', 3 FROM dual
    UNION ALL SELECT '003', '002', 1 FROM dual
    UNION ALL SELECT '003', '002', 2 FROM dual
    UNION ALL SELECT '004', '001', 1 FROM dual
)
select  case when c_id = '001' then s_id end s_id
    ,case when c_id = '001' then s_nm end s_nm
    ,c_nm
    ,max(chasu1) chaus1
    ,max(chasu2) chaus2
    ,max(chasu3) chaus3
    ,count(c_id) cnt
from    (
    select  a.s_id
    ,a.s_nm
    ,b.c_id
    ,b.c_nm
    ,decode(c.chasu,1,'O') chasu1
    ,decode(c.chasu,2,'O') chasu2
    ,decode(c.chasu,3,'O') chasu3
    from    student a cross join
    course b LEFT OUTER JOIN
    study  c
    on   a.s_id = c.s_id
    and b.c_id = c.c_id
    )
group by s_id,s_nm,c_id,c_nm
order by s_id,c_id

위의 쿼리문을 보면 alias의 명칭만 틀립니다. 하지만 결과값은 정 반대로 나오네요.... 이유좀 설명해주실수 있으실까요???

by 마농 [2012.05.15 09:49:59]

SQL 구문의 실행되는 순서를 알면 답이 보입니다.
SQL의 실행순서는 다음과 같습니다.
SELECT ----- ⑤
  FROM ----- ①
 WHERE ----- ②
 GROUP BY -- ③
HAVING ----- ④
 ORDER BY -- ⑥
1단계 From 절에서 사용된 알리아스는 2단계 이후 어디서나 사용 가능하구요
5단계 Select 절에서 사용된 알리아스는 Order By 절에서만 사용가능합니다.
이전 단계어서는 사용이 불가능 하구요.
사용하신 정렬구문 ORDER BY s_id, c_id 에서
s_id 와 c_id 는 Select 구문에서 사용된 별칭을 의미합니다.
따라서 원본과 같은 정렬결과를 얻으시려면 다음과 같이 하셔야 합니다.
SELECT ...
  FROM (서브쿼리) x
 GROUP BY ...
 ORDER BY x.s_id, x.c_id
;


by 완전초짜 [2012.05.15 09:53:52]

아... 서브쿼리내의 alias 명은 서브쿼리밖에서 alias를 다시줘서 사용해야 되는것이군요.... 감사합니다~~^^

by 마농 [2012.05.15 10:15:26]

[서브쿼리내의 alias 명은 서브쿼리밖에서 alias를 다시줘서 사용해야 되는것]은 아니죠... ㅡ,.ㅡ?
제 답글의 요점은 Order By 절에서의 컬럼명칭 사용에 유의해야 한다는 것인데...


by 완전초짜 [2012.05.15 10:51:07]

흠.... 그러면 하나더 질문이 있는데요 상위 쿼리문의 order by 절에는 서브쿼리의 alias를 사용하며 상위쿼리문의 출력부분에 alias를 달리주는것과 상위 쿼리문의 order by 절에 서브쿼리 자체에 alias를 주어서 order by 절에 처리하는 것과 다른것인가요???

쿼리문은 짜는데 이게왜 이렇게 되는지 모르고 짜는 부분이 많아서요..... 죄송합니다.... 독학의 실패네요...
ㅜ.ㅜ

by 마농 [2012.05.15 11:06:53]
 

2번 쿼리에서 Select 절에
case when c_id = '001' then s_id
end s_id 와 같이 별칭을 주었지요.
빨간색 s_id 는 본래의 s_id 이고 파란색은 별칭을 준 s_id 입니다.
ORDER BY s_id 에서 s_id 가 무었인지만 인지하시면 됩니다. 파란색이겠죠.

하지만
1번 쿼리에서 Select 절에
case when c_id = '001' then s_id
end "ID" 와 같이 별칭을 주었지요.
ORDER BY s_id 에서 s_id 가 무었인지만 인지하시면 됩니다. 빨간색이겠죠.

1번쿼리와 2번쿼리의 정렬구문에서 사용한 s_id 가 서로 다르다는것을 인지하셔야 합니다.


by 완전초짜 [2012.05.15 11:17:31]

아.... 그렇군요...
2번째 쿼리문에서 파란색 s_id가 정렬되서 코드값과 null값이 정렬 된것이고,
1번째 쿼리문에서는 빨간색 s_id로 정렬되어 코드값으로 정렬 되는 것이군요....
제가 이해한게 맞는지 알기위해서 한번더 적어봤습니다~
감사합니다~~
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입