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
운영게시판
최근게시물
MS-SQL Q&A 1165 게시물 읽기
No. 1165
쿼리문 관련 질문입니다. 고수님들 도와 주세요.
작성자
최인호
작성일
2004-01-30 11:45ⓒ
2004-01-30 11:52ⓜ
조회수
4,617

안녕하세요.

 

회원 가입을 받는 테이블인데요.

원래는 주민 번호를 키로 해서 중복 가입을 허용하지 않으려고 했으나

그렇게 하지 않고 중복을 허용했습니다.

 

그런데 문제는 어떻게 하면 유니크한 주민 번호의 해당 필드를 쿼리 할 수 있는지...

도무지 판단이 안되네요.....

 

테이블 예;

 

ID    NAME    RESNO               ADDRESS    EMAIL          REGDATE

1     홍길동   111111-1111111    서울시...     joy@h.com   2003-01-02

2     홍길동   111111-1111111    서울시...     joy@h.com   2003-01-03

3     김길동   222222-2222222    부산시...     k@nn.com    2003-02-03

 

 

 

이렇게 되어 있을때,

 

어떻게 하면 아래와 같은 결과가 나올까요.....??

 

1     홍길동   111111-1111111    서울시...     joy@h.com   2003-01-03

2     김길동   222222-2222222    부산시...     k@nn.com    2003-02-03

 

그리고 주민 번호가 같은 레코드가 여러개 이고 다른 정보가 다르더라도

그중에서 젤 처음 레코드나 그중 딱 한 레코드만 쿼리로 뽑을 수 있는지요?

 

 

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

임의의 두 레코드가 동일한 주민등록번호 값을 갖을 때

그 두 레코드의 다른 모든 컬럼도 동일한 값을 갖는다.

라는 것이 만족된다면 distinct 키워드를 사용하여

중복된 레코드를 하나만 갖고 오는 것이 가능합니다.

 

group by 를 이용해서도 가능하긴 하지만 distinct에 비해 좋은 점이

전혀 없습니다. (테이블의 모든 컬럼을 group by 절에 써주는 방법)

 

distinct나 group by 를 사용하게 되면 내부적으로 order by가

수행되기 때문에 퍼포먼스가 떨어질 수도 있습니다.

 

하지만 주민등록번호는 같지만, 다른 컬럼의 값이 틀릴 경우에는

'임의의 1개'를 선택해야 하므로 귀찮아 집니다..

 

예를들어 그 중에 id가 가장 작은 것을 선택한다.. 이런 원칙이

정해지면 inline view (from 절에 사용하는 select)를 이용해서

같은 주민번호당 가장 작은 id를 구해서 조인을 하는 등의 방법이

있긴 합니다.

 

항상 이렇게 조회하면.. 중복된 나머지 데이타는 쓰레기로 남으면서

성능만 저하시키는 상태가 되고...  (필요없는 인라인뷰 생성과 조인작업의 수행)

 

현재 상태가 잘못 된것이라 판단되시면 더 늦기 전에 데이터 정리를

하시는 것이 가장 좋은 방법인 것 같습니다.

 

백정현(trefoil)님이 2004-01-30 13:16에 작성한 댓글입니다.

말씀 감사합니다.

그런데....

 

혹시 위 테이블을 예로 인라인뷰를 예로 보여주실 수 있는지요?^^

 

왕초보라서.....

부탁드립니다.

 

최인호님이 2004-01-30 13:43에 작성한 댓글입니다. Edit

SELECT a.id, a.name, a.resno, a.address, a.email, a.regdate

FROM Table1 a

( SELECT MIN(ID) AS m_id

  FROM Table1 b

  WHERE a.RESNO = b.RESNO

) c

a.id = c.m_id

 

이런 모양이 되지 않을까 하는데요..

 

SELECT a.id, a.name, a.resno, a.address, a.email, a.regdate

FROM Table1 a

WHERE a.id =

    (SELECT MIN(id)

      FROM Table1 b

      WHERE a.resno = b.resno

    )

이렇게 해도 될것 같고...

 

위의 2가지 경우는 서브쿼리나 인라인뷰가 계속 수행되기 때문에

부분범위 처리시에 유용할 것 같고요..

 

전체를 다 읽어야 한다면 다음이 더 좋을 것 같습니다.

SELECT a.id, a.name, a.resno, a.address, a.email, a.regdate

FROM Table1 a

( SELECT MIN(ID) AS m_id

  FROM Table1

  GROUP BY resno

) b

a.id = b.m_id

 

 

제가 SQL Server를 갖고 있질 않아서...

실행 되는지 테스트는 못해봤습니다.

그냥 이런 모양의 쿼리면 될것이다라고 밖에는... ^^

백정현(trefoil)님이 2004-01-31 20:11에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
1168[질문]dbf 파일 여는 방법 [4]
wkdtjrgns
2004-02-02
7081
1167select문 관련 질문요.. [1]
초심
2004-01-31
3492
1166Oracle의 LPAD 함수가 MS-SQL에 없나요? [1]
김경민
2004-01-30
5789
1165쿼리문 관련 질문입니다. 고수님들 도와 주세요. [3]
최인호
2004-01-30
4617
1164Help : MSSQL Server Agent 가 구동이 되질않습니다.
김우영
2004-01-30
4673
1163쿼리문에 대한 질문...
궁금이
2004-01-30
3214
1161-- [1]
나승수
2004-01-28
4841
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다