달력

122024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

[QUERY] 중복데이터 제거

DB 2006. 7. 21. 20:44

간단한 쿼리인데 어떻게 해야 좋을지 감이 안와서 염치 무릅쓰고 질문 올립니다.
한 테이블에 2 개의 필드가 존재합니다. 한글이름과 한자이름인데요...

person_tbl 에
person_korname, person_chnname 라는 필드로 존재하고 있습니다.
그런데 한글 이름은 동일한데 한자 이름이 다른 경우가 많이 존재할 것입니다.

김종화 金宗和
김종화 金種華
김종화 金鍾華
김종화 金鍾化
김종환 金種桓
김중곤 金重坤
김중곤 金重坤
김중곤 金中坤

이런 식으로요...
이 상태에서 한글 이름은 같은데 한자 이름이 다른 경우의 수나 그 결과를 어떻게 뽑을 수 있을까요?
예를 들면 아래와 같이 말입니다.

김종화 金宗和 김종화 金種華
김종화 金宗和 김종화 金鍾華
김종화 金宗和 김종화 金鍾化
김중곤 金重坤 김중곤 金中坤

혹은 count(*) 의 결과가 4 가 되도록요...(김중곤의 1, 2 번째는 한글이름과 한자 이름이 완전 동일합니다)

조언 부탁드립니다.
이 글에 대한 댓글이 총 6건 있습니다.

만약에 위의 예에서,
김중곤 金中坤 ..... 항목이 한 번 더 나온다면,

쿼리 결과는
김종화 金宗和 김종화 金種華
김종화 金宗和 김종화 金鍾華
김종화 金宗和 김종화 金鍾化
김중곤 金重坤 김중곤 金中坤

인가요? 아니면,

김종화 金宗和 김종화 金種華
김종화 金宗和 김종화 金鍾華
김종화 金宗和 김종화 金鍾化
김중곤 金重坤 김중곤 金中坤
김중곤 金重坤 김중곤 金中坤

인가요?

SoQooL(김홍선)님이 2006-06-27 10:36:18에 작성한 댓글입니다.

김종화 金宗和 김종화 金種華
김종화 金宗和 김종화 金鍾華
김종화 金宗和 김종화 金鍾化
김중곤 金重坤 김중곤 金中坤
김중곤 金重坤 김중곤 金中坤

이 아니라

김종화 金宗和 김종화 金種華
김종화 金宗和 김종화 金鍾華
김종화 金宗和 김종화 金鍾化
김중곤 金重坤 김중곤 金中坤


였으면 좋겠습니다. 둘 다 표현이 가능하다면 그것도 좋겠지만요. ^^;;;
김종화(zepinos)님이 2006-06-27 11:03:21에 작성한 댓글입니다.

CREATE TABLE TAB38(
KONAME VARCHAR2(10),
CHNAME VARCHAR2(10)
)

INSERT INTO TAB38 VALUES(`김종화`,`金宗和`);
INSERT INTO TAB38 VALUES(`김종화`,`金種華`);
INSERT INTO TAB38 VALUES(`김종화`,`金鍾華`);
INSERT INTO TAB38 VALUES(`김종화`,`金鍾化`);
INSERT INTO TAB38 VALUES(`김종환`,`金種桓`);
INSERT INTO TAB38 VALUES(`김중곤`,`金重坤`);
INSERT INTO TAB38 VALUES(`김중곤`,`金重坤`);
INSERT INTO TAB38 VALUES(`김중곤`,`金中坤`);
INSERT INTO TAB38 VALUES(`김중곤`,`金中坤`);
INSERT INTO TAB38 VALUES(`김종화`,`金宗和`);
INSERT INTO TAB38 VALUES(`김종화`,`金種華`);

==============================================

1) 중복완전 배제

SELECT B.KONAME BKONAME,B.CHNAME BCHNAME,A.KONAME AKONAME,A.CHNAME ACHNAME
FROM
(SELECT DISTINCT KONAME,CHNAME FROM TAB38) A,
(
SELECT RM,KONAME,CHNAME
FROM
(
  SELECT ROW_NUMBER() OVER(PARTITION BY KONAME ORDER BY 1) RM
  ,KONAME,CHNAME
  FROM TAB38
)
WHERE RM=1
) B
WHERE A.KONAME=B.KONAME
AND A.CHNAME<> B.CHNAME

-------------------------------------------

2)중복허용

SELECT B.KONAME BKONAME,B.CHNAME BCHNAME,A.KONAME AKONAME,A.CHNAME ACHNAME
FROM

TAB38 A,
(
SELECT RM,KONAME,CHNAME
FROM
(
  SELECT ROW_NUMBER() OVER(PARTITION BY KONAME ORDER BY 1) RM
  ,KONAME,CHNAME
  FROM TAB38
)
WHERE RM=1
) B
WHERE A.KONAME=B.KONAME
AND A.CHNAME<> B.CHNAME


이렇게 하시면 될 듯 합니다.
김강환(hashtable)님이 2006-06-27 11:20:42에 작성한 댓글입니다.

답변 감사드립니다.
rownum 을 이렇게 이용하는 방법이 있었네요. 내공부족을 여실히 느낍니다. ^^;;;
김종화(zepinos)님이 2006-06-27 11:32:54에 작성한 댓글입니다.

중복배제는 아래와 같이 만들어 봤습니다.

SELECT   pk1, pc2, pk1 pk2, pc1
    FROM (SELECT person_korname pk1, person_chnname pc1,
                 FIRST_VALUE (person_chnname) OVER
     (PARTITION BY person_korname ORDER BY ROWNUM) pc2
            FROM person_tbl)
   WHERE pc1 <> pc2
GROUP BY pk1, pc1, pc2

SoQooL(김홍선)님이 2006-06-27 11:52:10에 작성한 댓글입니다.

GROUP BY를 사용하여 부하가 많은 DISTINCT를 피할 수 있군요. 굳 아이디어내요.
FIRST_VALUE 쓰임새도 그렇고. 이런 함수가 있다는 것은 알지만 막상 쿼리문에 응용한다는 것이 쉽지 않은데...
쿼리문이 깔끔하네요 ^^

'DB' 카테고리의 다른 글

DB Export  (0) 2008.05.30
aix, linux간의 data 이동 혹은 공유  (0) 2006.09.25
[대용량데이터베이스] 조인의 최적화  (0) 2006.07.20
SQL로 들어가서 XML로 나온다  (0) 2006.07.16
[QUERY] COUNT(*)를 빠르게  (0) 2006.07.16
Posted by 알 수 없는 사용자
|