오라클 쿼리질문드립니다.. 0 2 1,220

by QueryStudy 오라클 서브쿼리 중복제거 [2018.09.28 12:46:51]


SELECT * FROM (
 SELECT C.*
  FROM (
   SELECT BF.*
   , (SELECT COUNT(TAG) FROM DEPAS WHERE UPPER(BF.HOSTNAME) IN (UPPER(TAG))) CNT
   FROM (SELECT * FROM TBF) BF
  )C
)C
count를해보면 1000건이 나옵니다.
데이터는 아래와 같은 형식으로 나옵니다.
TEAM HOSTNAME STATUS IP OS_TYPE CNT
AAA ASWESew     Linux 0
AAA aswwEWA2     UNIX 1
BBB awDDf4     Windows 4
이 상태에서는 원하는 결과가 나오고있습니다.
그런데 여기서 추가로 가져올값이 있어 서브쿼리 추가하면
단일행 하위 질의에 2개 이상의 리턴값이 있다고 하며 조회가 안됩니다.

DEPAS 테이블과 T_BF 테이블을 조인을 할수 없는 상황이어서 서브쿼리로 조회할려고 하고있습니다..(조인하면 데이터 건수가 다르다고 합니다)
추가한 서브쿼리는 

SELECT * FROM (
 SELECT C.*
  FROM (
   SELECT BF.*
   , (SELECT COUNT(TAG) FROM DEPAS WHERE UPPER(BF.HOSTNAME) IN (UPPER(TAG))) CNT
   , (SELECT TAG FROM DEPAS WHERE UPPER(BF.HOSTNAME) IN (UPPER(TAG)))  TAG
   , (SELECT SOURCEID FROM DEPAS WHERE UPPER(BF.HOSTNAME) IN (UPPER(TAG)))  SOURCEID
   FROM (SELECT * FROM TBF) BF
  )C
)C

위와 같습니다.
이 쿼리를 사용하면 일정 데이터가 나오다가 
중복 건수가 있으면 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다
라는 메세지가 나오고있습니다.
여기서 TAG 컬럼에 중복 데이터가 들어있습니다.

어떻게 처리해야 할까요..




by 마농 [2018.09.28 13:10:07]

건수와 tag 를 함께 조회한다는것 자체가 말이 안됩니다.
 - 건수는 집계된 결과 1건 이고
 - tag 나 sourceid 는 그냥 일반 항목 여러건 입니다.
1건 짜리와 여러건 짜리를 한줄에 본다는게 말이 안됩니다.
tag 의 경우엔 어차피 동일항목이 중복으로 여러건일테니
Distinct 로 중복을 제거하거나 min/max 로 한건만 가져와도 됩니다.
sourceid 는 이게 쿼리만 봐서는 동일자료 중복인지? 아니면 여러값을 가지는지? 판단이 안되고요.


by QueryStudy [2018.09.28 14:06:14]

마농님 답변 감사합니다. 서브쿼리에서 MAX/MIN 추가하면 검색이 되긴하는데

아래와같이 

SELECT * FROM (
 SELECT C.*
   , (SELECT MIN(TAG) FROM DEPAS WHERE UPPER(BF.HOSTNAME) IN (UPPER(TAG)))  TAG
   , (SELECT MN(SOURCEID) FROM DEPAS WHERE UPPER(BF.HOSTNAME) IN (UPPER(TAG)))  SOURCEID
  FROM (
   SELECT BF.*
   , (SELECT COUNT(TAG) FROM DEPAS WHERE UPPER(BF.HOSTNAME) IN (UPPER(TAG))) CNT
   FROM (SELECT * FROM TBF) BF
  )C
)C 
--조건절을 넣으면 무한로딩현상이 생깁니다. 
WHERE C.SOURCEID IS NOT NULL

 

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