database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 38779 게시물 읽기
No. 38779
안녕하세요. 중복쿼리 1ROW 만들기 질문드립니다.
작성자
질문자
작성일
2011-08-12 16:14
조회수
5,714

 

안녕하세요.

데이터가 만약

VAL1                           VAL2                 VAL3

2011-08-12               A                           Y

2011-08-12               A                           N

2011-08-12               A                           N

2011-08-12               A                           N

2011-08-12               B                           N

2011-08-12               B                           N

2011-08-12               B                           N

이라는 데이터가 있을때 결과값이

2011-08-12               B                           N

만 가져오려면 어떻게 해야할까요? Y인 값만 찾아서 NOT IN 으로 걸러내려고 했는데,

그 보다 더 좋은 방법도 있을 거 같아 선배님들께 조언을 부탁드립니다.

 

즉, PK는 VAL1, VAL2인데 실질적으로는 PK가 걸려있지 않아 중복되어 N ROW가 들어옵니다.

근데 그 중복되는 ROW중에 사용구분값 VAL3가 이미 사용했다! 라는 상태가 있을 경우

그 데이터는 제외하고 N인건만 조회하는 쿼리를 조언 부탁드립니다.

 

감사합니다.

 

이 글에 대한 댓글이 총 3건 있습니다.

쿼리가 좀 복잡해 보이긴 하는데,

중요한건 exists 구문 다음의 subquery에 의미상 Key로 Join하는것과

사용여부 Y를 제외한다는 것입니다.

with t as

(select '2011-08-12' dt, 'A' cd, 'Y' use_yn from dual
union all select '2011-08-12', 'A', 'N' from dual
union all select '2011-08-12', 'A', 'N' from dual
union all select '2011-08-12', 'A', 'N' from dual
union all select '2011-08-12', 'B', 'N' from dual
union all select '2011-08-12', 'B', 'N' from dual
union all select '2011-08-12', 'B', 'N' from dual
)
select distinct dt, cd
from t
where not exists (select 1
                    from t v1
                   where v1.dt = t.dt
                     and v1.cd = t.cd
                     and use_yn = 'Y')
마늘장(zzro21)님이 2011-08-12 16:44에 작성한 댓글입니다.
이 댓글은 2011-08-12 16:45에 마지막으로 수정되었습니다.

WITH t AS
(
SELECT '2011-08-12' dt, 'A' cd, 'Y' yn FROM dual
UNION ALL SELECT '2011-08-12', 'A', 'N' FROM dual
UNION ALL SELECT '2011-08-12', 'A', 'N' FROM dual
UNION ALL SELECT '2011-08-12', 'A', 'N' FROM dual
UNION ALL SELECT '2011-08-12', 'B', 'N' FROM dual
UNION ALL SELECT '2011-08-12', 'B', 'N' FROM dual
UNION ALL SELECT '2011-08-12', 'B', 'N' FROM dual
)
SELECT dt, cd
     , MAX(yn) yn
  FROM t
 GROUP BY dt, cd
HAVING MAX(yn) = 'N'
;

마농(manon94)님이 2011-08-12 16:54에 작성한 댓글입니다.

마농님 마늘장님 감사드립니다 ^^

여러가지 방법으로 생각해봤었는데, 많은 참고가 되었습니다.

좋은하루되세요!

질문자님이 2011-08-12 17:13에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
38782Hot백업복구시 redo로그파일이 없다면, 어디까지 복구가능한가? [1]
이태훈
2011-08-16
5822
38781imp 오류 [2]
초보
2011-08-16
6775
38780SQL튜닝 부탁드립니다. [2]
jinkuidong
2011-08-15
5916
38779안녕하세요. 중복쿼리 1ROW 만들기 질문드립니다. [3]
질문자
2011-08-12
5714
38778Active - Active DB 데이터 동기화 [4]
곤지
2011-08-12
6283
38777update 하는 조건... [2]
권기혁
2011-08-12
4330
38776oracle sql developer 설치 및 사용 문의 [1]
전상도
2011-08-12
4731
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.019초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다