Oracle JOIN 중복제거 와 조인 (distinct, rowid, cnt)
페이지 정보
본문
[ 방법1 ]
예제1 >
sql = "SELECT * FROM( "
sql = sql & " select * from( "
sql = sql & " select a.type,a.link_tab, b.title as title1, b.kwk, c.tik, d.para as imgpara,
sql = sql & " row_number() over (partition by a.article_seq order by a.article_a_no) cnt, a.ARTICLE_A_NO
//요부분 이 as cnt하고 및에서 cnt="1"1로하면 중복없는조인
// 하지만 문제는 다른테이블정보가 자세히보면 가득히 중복이라는거
from aaa a, bbb b, ccc c
where a.article_a_no= 'HDKJBO_2003_v7n1_001'
and a.article_seq = b.article_seq(+)
and a.article_seq =c.article_seq(+)
//그래서 조인을 여기서~ 그럼 완료
slq = sql &" ) b where b.cnt='1') WHERE ROWNUM >= 1 AND ROWNUM <= 20 "
//rownum 은 간단히처리~
예제2 >
select * from (select b.field4, row_number() over (partition by b.field1 order by b.field1) cnt, b.field1
from aaa a, bbb b where b.field1 = c.field1 and c.field2 = '"& idx &"') where cnt ='1' and rownum <= 100
예제3>
sql = sql &"select field4, field1, field3 from ( "
sql = sql &"Select rownum row_num, se.* FROM ( "
sql = sql &"select * from ( "
sql = sql &"select row_number() over(partition by b.field1 order by b.field1) cnt , b.field4, b.field1, b.field3 "
sql = sql &"from aaa a INNER JOIN bbb b ON a.field2=b.field1 where a.field5 = '462' "
sql = sql &") where cnt ='1' "
sql = sql &") se "
sql = sql &") where row_num BETWEEN 1 AND 5"
[ 방법 2 ]
[ DISTINCT ]
제시된 필드에 대한 중복체크 (n개 모두)
고로...다수개의 필드중 하나의 필드에만 중복체크가 필요할때는 사용이 불가능하다.
SELECT DISTINCT field1
FROM table_name
WHERE field1 = ''
ORDER BY field1
[ ROWID ]
다수개의 필드중 단 하나의 필드에만 중복 체크를 하려할 경우
SELECT field1 -- 이넘의 중복건만 제거
, field2
, field3
FROM table_name
WHERE field1 = ''
AND rowid in( select max(rowid) from table_name group by field1 )
ORDER BY field1
rowid는 데이터가 많을 경우 부하를 가져온다.
이때는 SUBSELECT를 사용한다.
select *
from tb_test
where reg_tm between start_tm and end_tm
and rowid in (select max(rowid) from tb_test group by field1)
// 이 구문은 rowid가 숫자일 경우에만 유효합니다.
관련자료
http://blog.naver.com/eoqufryghl/111357685
http://ky1004.blog.me/30039201009
http://blog.daum.net/mygunsan/1
http://eknote.tistory.com/901
예제1 >
sql = "SELECT * FROM( "
sql = sql & " select * from( "
sql = sql & " select a.type,a.link_tab, b.title as title1, b.kwk, c.tik, d.para as imgpara,
sql = sql & " row_number() over (partition by a.article_seq order by a.article_a_no) cnt, a.ARTICLE_A_NO
//요부분 이 as cnt하고 및에서 cnt="1"1로하면 중복없는조인
// 하지만 문제는 다른테이블정보가 자세히보면 가득히 중복이라는거
from aaa a, bbb b, ccc c
where a.article_a_no= 'HDKJBO_2003_v7n1_001'
and a.article_seq = b.article_seq(+)
and a.article_seq =c.article_seq(+)
//그래서 조인을 여기서~ 그럼 완료
slq = sql &" ) b where b.cnt='1') WHERE ROWNUM >= 1 AND ROWNUM <= 20 "
//rownum 은 간단히처리~
예제2 >
select * from (select b.field4, row_number() over (partition by b.field1 order by b.field1) cnt, b.field1
from aaa a, bbb b where b.field1 = c.field1 and c.field2 = '"& idx &"') where cnt ='1' and rownum <= 100
예제3>
sql = sql &"select field4, field1, field3 from ( "
sql = sql &"Select rownum row_num, se.* FROM ( "
sql = sql &"select * from ( "
sql = sql &"select row_number() over(partition by b.field1 order by b.field1) cnt , b.field4, b.field1, b.field3 "
sql = sql &"from aaa a INNER JOIN bbb b ON a.field2=b.field1 where a.field5 = '462' "
sql = sql &") where cnt ='1' "
sql = sql &") se "
sql = sql &") where row_num BETWEEN 1 AND 5"
[ 방법 2 ]
[ DISTINCT ]
제시된 필드에 대한 중복체크 (n개 모두)
고로...다수개의 필드중 하나의 필드에만 중복체크가 필요할때는 사용이 불가능하다.
SELECT DISTINCT field1
FROM table_name
WHERE field1 = ''
ORDER BY field1
[ ROWID ]
다수개의 필드중 단 하나의 필드에만 중복 체크를 하려할 경우
SELECT field1 -- 이넘의 중복건만 제거
, field2
, field3
FROM table_name
WHERE field1 = ''
AND rowid in( select max(rowid) from table_name group by field1 )
ORDER BY field1
rowid는 데이터가 많을 경우 부하를 가져온다.
이때는 SUBSELECT를 사용한다.
select *
from tb_test
where reg_tm between start_tm and end_tm
and rowid in (select max(rowid) from tb_test group by field1)
// 이 구문은 rowid가 숫자일 경우에만 유효합니다.
관련자료
http://blog.naver.com/eoqufryghl/111357685
http://ky1004.blog.me/30039201009
http://blog.daum.net/mygunsan/1
http://eknote.tistory.com/901
댓글목록
등록된 댓글이 없습니다.