SQLite 쿼리 Oracle로 변환 질문입니다. 0 6 1,200

by 시리 [SQL Query] [2017.01.10 14:21:08]


                             select a.loca_name, a.loca_id, ifnull(b.surv_id, 0)  
                             from location as  a  
                             left outer join(  
                             select loca_id, count(surv_id) as surv_id  
                             from survey_his  
                             group by loca_id  
                             ) as b   
                             on (a.loca_id = b.loca_id)  
                             group by a.loca_id

요런 SQLite 쿼리를 오라클로 바꾸려고 하는데 뭘 해도 잘 안 되네요 ㅠㅠ...

 

테이블도 약간 다르고 한데 

 


select l.loca_name, l.loca_id, count(h.surv_no)
from location l, surveyH h
where l.loca_id = h.surv_loca_id
group by l.loca_id

 

이렇게 쓰면 그룹 바이 표현식이 아니라고 뜹니다...ㅠㅠ

 

결과값은

 

"기타부서"    "1"    "0"
"강남지원"    "2"    "6"
"경영지원팀"    "3"    "2"
"지원사무실"    "4"    "582"
"사업지원팀"    "5"    "0"
"시험분석팀"    "6"    "0"
"개성검사센터"    "7"    "0"
"제품검사팀"    "8"    "0"

 

이런 식으로 나와야 하는데 어떻게 바꿔야 할까요 ...

by 마농 [2017.01.10 14:25:26]

ifnull 함수만 nvl 로 바꾸면 문법은 ANSI 표준이므로 동일합니다.

아. 하나 더 있네요. FROM 절의 AS a, AS b 에서 AS 빼세요.


by 시리 [2017.01.10 14:36:30]

 

select l.loca_name, l.loca_id, count(h.surv_loca_id)
from location l
left outer join surveyH h
on l.loca_id = h.surv_loca_id
group by l.loca_name, l.loca_id, h.surv_loca_id
order by l.loca_id asc

 

뭔가 테이블이 좀 달라서 이거였습니다!!
감사합니다 :-D


by 시리 [2017.01.10 14:37:12]

그런데 왜 오라클에서는 group by에 모든 컬럼을 다 넣어줘야 하나요???


by 마농 [2017.01.10 14:43:10]

h.surv_loca_id 는 그룹바이에서 빼야 하구요.
오라클이 이상한게 아니라 SQLite 나 MySQL 이 이상한 것입니다.
그룹바이 기준이 아닌 항목은 집계를 해야만 합니다. 단독으로 쓸 수 없죠.
 


by 마농 [2017.01.10 14:44:25]
-- 1. ANSI 표준 유지 --
SELECT a.loca_name
     , a.loca_id
     , NVL(b.surv_id, 0) cnt              -- IFNULL > NVL
  FROM location a                         -- AS 제거
  LEFT OUTER JOIN
       (SELECT loca_id
             , COUNT(surv_id) AS surv_id
          FROM survey_his
         GROUP BY loca_id
        ) b                               -- AS 제거
    ON (a.loca_id = b.loca_id)
-- GROUP BY a.loca_id                     -- 불필요한 부분
 ORDER BY a.loca_id                       -- 정렬 필요
;

-- 2. 서브쿼리(인라인뷰) 제거 --
SELECT a.loca_name
     , a.loca_id
     , COUNT(b.surv_id) cnt
  FROM location a
  LEFT OUTER JOIN survey_his b
    ON a.loca_id = b.loca_id
 GROUP BY a.loca_id, a.loca_name
 ORDER BY a.loca_id
;

-- 3. Oracle 아우터 조인
SELECT a.loca_name
     , a.loca_id
     , COUNT(b.surv_id) cnt
  FROM location a
     , survey_his b
 WHERE a.loca_id = b.loca_id(+)           -- 아우터조인(+)
 GROUP BY a.loca_id, a.loca_name
 ORDER BY a.loca_id
;

 


by 시리 [2017.01.10 14:51:10]

감사합니다

2일동안 고생하고 있었는데 해결되어서 정말 기쁘네요!!!

 

하시는 일 번창하시고 좋은 하루 되셔요!! 

변환 과정도 상세하게 알려주셔서 감사합니다!

제가 sqlite만 써서 오라클을 잘 몰랐는데 친절한 답변에 감동하고 갑니다!!!!

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