조인문 인데 1:1 조인 쿼리문 체크 좀 해주세요ㅠ 0 2 1,356

by 청주띠기리 [2008.12.01 21:08:28]


 안녕하세요!

10시간 째 이 문제 때문에 다른것도 진행 못하고 끙끙 대네요 ㅠ.ㅠ

제가 하고 싶은건

A테이블       B테이블          
A.PK NAME FLUG   B.PK A.PK NAME HH OO DATE
1 서울 0   1 1 서울 11.2 13.3 2008-10-10
2 경기 0   2 1 서울 12.4 13.4 2008-10-09
3 울산 0   3 3 울산 12.5 15.6 2008-10-10
4 포항 0   4 3 울산 15.3 14.5 2008-10-10
5 대구 0   5 5 대구 13.6 16.7 2008-10-11
6 부산 0   6 5 대구 16.7 17.7 2008-10-10
7 제주 1   7 5 대구 16.5 12.7 2008-10-09
                   

 

A 테이블에 PK 가 10개면 10개만 출력되야 해요. 3개면 3개만...

그럼 A 와 B 테이블을 조인을 하였을 때

B 테이블에서 A 테이블 PK 가 1 인 레코드가 2개 이자나요.. 그 중에 가장 최근에 등록된 것 1개만 출력하는거예요..A테이블 플러그가 0인것만 허용... 1이면 걍 넘어 가구요..

그럼 출력 예상이..

1  서울  0         1               1         서울      11.2    13.3     2008-10-10

2  경기  0      NULL      NULL    NULL  NULL  NULL       NULL 

3  울산  0           3               3       울산        12.5     15.6      2008-10-10

4  포항  0      NULL      NULL    NULL  NULL  NULL       NULL    

5  대구   0          5                 5       대구        13.6     16.7        2008-10-11

6 부산  0      NULL      NULL    NULL  NULL  NULL       NULL    

 

여기까지 출력 예상 이구요..

 

쿼리문은 ..

select * from A테이블 a, (  select * from ( select B테이블PK, B.NAME,B.HH,B.OO from B테이블 b where 1=1 and rowid in (select max(rowid) from B테이블 group by B테이블PK) )) b where a.pk = b.pk(+) and a.flug !=1 order by a.pk desc

이렇게 했더니 제가 원하는 대로 나오긴 나오는데 문제는...

최근 값이 안나오고 예전 값이 나와요..ㅠㅠ

 

저의 한계 입니다 ㅠ.ㅠ 도움의 손길을 ㅠ.ㅠ

by 김강환 [2008.12.02 08:54:55]
WITH TEMPA AS (SELECT '1' PK, '서울' NAME, 0 FLAG FROM DUAL UNION ALL
SELECT '2' PK, '경기' NAME, 0 FLAG FROM DUAL UNION ALL
SELECT '3' PK, '울산' NAME, 0 FLAG FROM DUAL UNION ALL
SELECT '4' PK, '포항' NAME, 0 FLAG FROM DUAL UNION ALL
SELECT '5' PK, '대구' NAME, 0 FLAG FROM DUAL UNION ALL
SELECT '6' PK, '부산' NAME, 0 FLAG FROM DUAL UNION ALL
SELECT '7' PK, '제주' NAME, 1 FLAG FROM DUAL
)
, TEMPB AS (
SELECT '1' BPK, '1' APK, '서울' NAME, 11.2 HH, 13.3 OO, '2008-10-10' TDATE FROM DUAL UNION ALL
SELECT '2' BPK, '1' APK, '서울' NAME, 12.4 HH, 13.4 OO, '2008-10-09' TDATE FROM DUAL UNION ALL
SELECT '3' BPK, '3' APK, '울산' NAME, 12.5 HH, 15.6 OO, '2008-10-10' TDATE FROM DUAL UNION ALL
SELECT '4' BPK, '3' APK, '울산' NAME, 15.3 HH, 14.5 OO, '2008-10-10' TDATE FROM DUAL UNION ALL
SELECT '5' BPK, '5' APK, '대구' NAME, 13.6 HH, 16.7 OO, '2008-10-11' TDATE FROM DUAL UNION ALL
SELECT '6' BPK, '5' APK, '대구' NAME, 16.7 HH, 17.7 OO, '2008-10-10' TDATE FROM DUAL UNION ALL
SELECT '7' BPK, '5' APK, '대구' NAME, 16.5 HH, 12.7 OO, '2008-10-09' TDATE FROM DUAL
)
SELECT T2.PK,T2.NAME,T2.FLAG
,T1.BPK,T1.APK,T1.NAME,T1.HH,T1.OO,T1.TDATE
FROM
(
SELECT BPK,APK,NAME,HH,OO,TDATE
FROM
(
SELECT BPK,APK,NAME,HH,OO,TDATE
,ROW_NUMBER() OVER(PARTITION BY APK ORDER BY TDATE DESC NULLS LAST) RM
FROM TEMPB
) WHERE RM=1
) T1,TEMPA T2
WHERE T1.APK (+) =T2.PK
AND T2.FLAG=0

쿼리의 이해도는 충분하신 것 같은데 ROWID를 사용한 것이 문제인듯 합니다. ROWID는 로우가 저장된 물리적 위치입니다. ROWID가 가장 큰 것과 DATE가 가장 큰 것 하고는 아무런 관련이 없습니다.

by 청주띠기리 [2008.12.02 10:21:15]
헐...
김강환님 정말 감사합니다 ㅠ.ㅠ
위드절을 이용해서 가독성을 높이고... 성능 향상하고...
임시 스페이스에 저장 하고...
쿼리문이 너무 부드럽습니다 ㅠ.ㅠ
제가 원하는 결과 100% 제대로 나왔어요!! 정말 감사합니다 ㅠ.ㅠ
대단하심 ㅠ.ㅠ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입