rowid 비교적 초보문제 0 5 2,102

by 김태형 [2008.12.16 23:36:52]


 

 

select    *   from    addrbook;

SQL> select  rowid , a.* from addrbook a;

ROWID                          JUMIN                            NAME                 ADDR                          TEL                

AAAHbHAABAAAMZKAAA  111111-2222222   김태형               서울시    010-1111-1111      
AAAHbHAABAAAMZKAAB  333333-4444444   김태희               서울시    010-1111-1111      
AAAHbHAABAAAMZKAAC  111111-2222222   김문선               서울시    011-2222-3333       

=============max값은 김문선씨!

select max(rowid) from addrbook;

MAX(ROWID)        
-------------------
AAAHbHAABAAAMZKAAC

1 rows selected.

==============그래서, 삭제할때 조건을 max값으로 했습니다.

delete   from addrbook a
where   rowid    <     (   select    max(rowid)      from     addrbook b
                                        where   a.jumin   =   b.jumin);

SQL> delete from addrbook a
where rowid < (select max(rowid) from addrbook b
                where a.jumin = b.jumin);

1 rows Deleted.

궁금점은 지금부터 시작됩니다.

rowid 끝이 C보다 작으면 다 삭제가 되어서 2개가 DELETED 될줄 알았는데. 달랑 1개 그것도

제일작은것만 되었고 B는 삭제가 되지 않았습니다.

어떻게 돌아가는건지 감당이 안되네요 ㅎㅎ 갈켜주세요

 

ROWID               JUMIN          NAME                 ADDR                                                  TEL                
AAAHbHAABAAAMZKAAB  333333-4444444 김태희               서울시       010-1111-1111      
AAAHbHAABAAAMZKAAC  111111-2222222 김문선               서울시      011-2222-3333      

by 웅 [2008.12.16 23:52:59]
조건중에 주민번호가 같은 것중에서 max(rowid)가 작은것을 삭제하라고 하셨네요.
주민번호가 같은것은 2개고 그중에 한건이 지워졌으니..제대로 완료~^^;;

by 김태형 [2008.12.17 01:08:22]
서브쿼리에서 max를안하고 select를햇다면 b는 5가지가 컬럼을 가지고 있는걸로 알고있습니다. jumin id1개당 2개씩 가지는게 2개고 김태희 컬럼은 단독 1개이며.. 이 5개 row중 큰 rowid는 뒤끝이 c인걸루 알구여 해서 c보다 작은거 2개 a,b가 지워질줄 알고있었습니다. 웅님 말씀하신거 이해하고싶은데 ㅠ ㅠ제대로 이해를 못하겠네요.. 주민번호 같은것 중에서 큰게 c아닌가여..깊게 설명좀 부탁드려요

by 웅 [2008.12.17 09:19:28]
delete절에서 delete from addrbook a먼저 실행될까요? 아니면 서브쿼리부터 먼저 실행될까요?
그리고 왜 서브쿼리에 where a.jumin = b.jumin 이 문장을 어떤 역할을 할까요?
이 두가지를 잘 생각해보세요.

by 피터 [2008.12.17 10:33:43]
1. 아래 쿼리는 결과가 2건이 나옵니다. jumin이 같은 것에 대한 각각의 max에 해당하는 자료를 가져옵니다.
select a.rowid, a.* from addrbook a
where rowid = (select max(rowid) from addrbook b where a.jumin = b.jumin);

2. 아래 쿼리는 결과가 1건이 나옵니다. 삭제된 자료 1개만 나오게 됩니다.
select a.rowid, a.* from addrbook a
where rowid < (select max(rowid) from addrbook b where a.jumin = b.jumin);

where a.jumin = b.jumin에 해당되는 각각의 max를 얻어서 그보다 작은 데이터를 가져옵니다.
333333-4444444에 해당되는 자료는 본인이 max이므로 이보다 작은 결과는 나오지 않습니다.

3. 아래 쿼리는 2건이 나옵니다. - 이 경우가 원래 의도하셨던 경우인 것 같습니다.
select a.rowid, a.* from addrbook a
where rowid < (select max(rowid) from addrbook);

delete를 실행할때는 항상 delete할 결과를 반드시 select해보고 실행하는 것이 좋습니다.

by 김태형 [2008.12.18 23:18:47]
아 도저히 제가 생각했던 거랑 다르네요 계속 생각하면 이거 뭐
그룹바이 한거나 마찬가지인데.
위에 분들 쿼리한것들은 제가 다 해보고 안보고 이해가 안가서
질문한거에요.. 웅님 서브쿼리부터 당연히 시작되죠 실행계획 안봐도
당연히 덜덜.. 제가 그것도 모르고 염치없이 여기 질문하겠습니까..기본은
제가 다 해야죠..

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