쿼리문 질문 드립니다. 0 10 2,120

by 후레쉬 [SQL Query] [2014.08.01 08:16:11]


아래와 같은 형식의 쿼리문 인데요,,, 에러가 납니다.
ORA-00904: "A.""nm1": 부적합한 식별자.
a.nm1 을 인식을 못하네요,,,
어떻게 해야 인식을 할까요?

select
(select count(*) from (select title2 from tbl1 where nm1 = a.nm1 group by nm2) dual)
from tbl1 a inner join tbl2 b on a.title1= b.title1
where nm1 <> ''
group by title1
order by title1

답변 부탁 드립니다.
감사합니다.

by 마농 [2014.08.01 08:35:32]

- 원인 : 메인쿼리의 항목이 서브쿼리의 2 Depth 안으로 들어가지 못합니다.
- 조치 : 2 Depth 침투가 꼭 필요한 상황인지 판단해보고 다른 방식으로 변경해야 합니다.
- 기타 : 위의 에러 말고도 오류가 많은 쿼리입니다.
- where nm1 <> '' 이 조건은 nm1 IS NOT NULL 로 바꿔야 하며
- Group By title1 을 했으므로 title1 을 제외한 다른 항목(a.nm1) 을 Select 에서 사용 못합니다.
  Select 절의 서브쿼리 조건에서도 a.nm1 을 사용할 수 없다는 말이죠.
- 전체적으로 논리적인 오류를 가진 SQL 이므로 단순 문법오류 수정이 아닌
  논리적인 오류를 해결해야 합니다.


by 후레쉬 [2014.08.01 08:48:19]

빠른답변 감사드립니다.
쿼리 예문에 잘못 된점 죄송합니다.

원인 : 메인쿼리의 항목이 서브쿼리의 2 Depth 안으로 들어가지 못합니다.
=> 아 그렇군요;;

select count(*) from (select title2 from tbl1 where nm1 = a.nm1 group by nm2) dual
=> 이렇게 한 이유는..
select title2 from tbl1 where nm1 = a.nm1 group by nm2
=> 이러한 결과물로 row count 가 13개가 나왔는데, 제가 원하는 값은 단일 scalar 값인 13 이라는 거거든요.
그래서 dual 을 사용 하였습니다.

dual 말고 어떻게 사용 해야 할까요?

 

다시 한번 답변 부탁 드립니다.


by 마농 [2014.08.01 10:11:13]

1. dual 은 큰 의미가 없습니다. 단순 알리아스일 뿐이구요.
2. 2 Depth 문제는 서브쿼리 하나 줄이고 바로 Count 하면 해결 됩니다.
3. 문제는 2 Depth 가 아니라 다른데 있죠.
  - Group BY title1 하면서 nm 에 해당하는 걸 가져올수는 없죠.


by 후레쉬 [2014.08.01 14:02:45]

마농님 답변 감사드립니다.

2. 2 Depth 문제는 서브쿼리 하나 줄이면 된다는데, 어떻게 해야 하나요?

위에도 드렸던 질문인데요,

select title2 from tbl1 where nm1 = a.nm1 group by nm2

이렇게 쿼리를 하면, 아래와 같은 결과물이 나왔다 치면요...
title2
aaa
bbb
ccc
ddd
eee
fff

제가 원하는건, 6 이라는 값인데요,  count(*) over() 를 사용해 봐도 결과물은
6
6
6
6
6
6
이렇게 나오더라구요..

다시 한번 답변 부탁 드립니다.


by 마농 [2014.08.01 14:20:27]

지금 보니 이구문도 오류네요.
select title2 from tbl1 where nm1 = a.nm1 group by nm2
group by nm2 하면서 select title2 하고 있네요.
group by nm2 하면 select 절에 title2 가 올 수 없습니다.
문제는 2Depth 가 아닙니다.
Group By 가 문제입니다.
2Depth 문제는 Group By 에 대한 이해 부족으로 발생된 2차적인 문제입니다.
Group By 부터 해결하시는게 맞지 않을런지요?


아니면 질문 형태를 바꿔보세요.
원본자료와 그에 따른 결과자료를 예로 들고
결과가 나오게 되는 인과관계를 설명해주세요.


일단 2Depth 해결은...
- 전 : SELECT COUNT(*) FROM (SELECT 1 FROM t ...)
- 후 : SELECT COUNT(*) FROM t ...


by 후레쉬 [2014.08.01 15:45:57]

마농님 죄송 합니다. 예제를 엉망으로 드려군요 ㅠ

 select col1 from tbl1 group by col1

위의 결과값이

col1

aaa

bbb

ccc

일 경우 제가 원하는 결과값은 3 입니다.

그래서 제가 쿼리를 만든게,

select count(*) from (select col1 from tbl1 group by col1);

이거구요.. 근데, 이게 2 depth 잖아요..

1 depth 쿼리를 못 만들겠습니다.

다시 한번 답변 부탁 드립니다 (__)

 


by 마농 [2014.08.01 15:47:15]

select COUNT(DISTINCT col1) from tbl1


by 후레쉬 [2014.08.01 16:42:36]

마농님 정말 답변 감사드립니다.
추가 질문 하나만 더요..

만일, 이런 케이스일때도 같은 방법으로 가능 할까요?
select col1,col2 from tbl1 group by col1,col2

 

이렇게 저렇게 해 봤는데, 안되서요...


by 마농 [2014.08.01 16:47:33]

select COUNT(MIN(1)) from tbl1 group by col1,col2


by 후레쉬 [2014.08.01 17:27:40]

마농님 답변 감사드립니다.
즐거운 주말 보내세요 ^^

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