[퀴즈] 연관성 있는 자료 찾기 1 9 4,034

by 마농 계층쿼리 [2010.02.03 17:57:31]


[퀴즈] 연관성 있는 자료 찾기

다음과 같이 테이블이 있습니다.
이 테이블에서 aa = 1 이고 bb = '가' 이고 cc = 30 인 자료를 조회할 경우
조회된 자료와 aa 또는 bb 또는 cc가 같은 자료를 찾고
다시 또 찾은 자료로부터 aa 또는 bb 또는 cc가 같은 자료를 찾아가는 것입니다.
이렇게 연관된 자료를 찾고 거기에 또 연관된 자료를 찾는 쿼리를 작성해 보세요.

조건 조건
aa = 1, bb = '가', cc = 30 aa = 3, bb = '다', cc = 60
원본 결과 결과
PK AA BB CC PK AA BB CC PK AA BB CC
01 1 30 01 1 30 04 3 60
02 2 50 02 2 50 05 3 80
03 2 50 03 2 50 06 1 20
04 3 60 04 3 60 08 1 30
05 3 80 05 3 80 09 4 80
06 1 20 06 1 20
07 9 99 08 1 30
08 1 30 09 4 80
09 4 80

WITH t2 AS
(
SELECT '01' pk, 1 aa, '가' bb, 30 cc FROM dual
UNION ALL SELECT '02', 2, '라', 50 FROM dual
UNION ALL SELECT '03', 2, '다', 50 FROM dual
UNION ALL SELECT '04', 3, '다', 60 FROM dual
UNION ALL SELECT '05', 3, '라', 80 FROM dual
UNION ALL SELECT '06', 1, '나', 20 FROM dual
UNION ALL SELECT '07', 9, '카', 99 FROM dual
UNION ALL SELECT '08', 1, '라', 30 FROM dual
UNION ALL SELECT '09', 4, '하', 80 FROM dual
)
SELECT * FROM t2
;

정답은 몇일 뒤에 올리겠습니다.


[정답보기] <== 트리플클릭
SELECT DISTINCT pk, aa, bb, cc
  FROM t2
 START WITH aa = 1
   AND bb = '가'
   AND cc = 30
 CONNECT BY NOCYCLE PRIOR aa = aa
 OR PRIOR bb = bb
 OR PRIOR cc = cc
 ORDER BY pk
;

by Ejql [2010.02.05 17:10:31]
역시.. 아직 계층쿼리를 이해못했나 봅니다.
또 하나 배우고 갑니다.

by Ejql [2010.02.05 17:12:38]
조건 2번째에서요.
aa = 3, bb = '다', cc = 60

의문이 드는것은
1, 가, 30도 연관성이 있는듯합니다. (찾아보면은 더나오지만 )
저는 연관성이 있는걸로 생각이 드는데요. 아닌가요?

by 마농 [2010.02.06 02:40:44]
훔.. 그렇군요..
지금 집에서 실행해보니 1, 가, 30 과 동일한 결과가 나오네요.
회사에선 저런 결과가 나왔네요
왜 저런 결과가 나왔을까요? 월요일에 회사가서 확인해 봐야겠네요.

by 마농 [2010.02.08 08:41:31]
Ejql님 말씀대로 두번째 조건에서도 첫번째 조건과 동일한 결과가 나와야 하는것이 맞습니다.
집에서 실행한 결과도 그러했구요.(Window - 10G XE)
그런데 회사에서 실행한 결과는 다르네요.(Unix - 10G EE 10.2.0.3.0 64bit)
조건으로 주어진 행보다 아래쪽에 있는 자료만 검색하네요...
버그가 아닐런지...
다른 분들은 결과가 제대로 나오나요?

by Ejql [2010.02.09 16:34:50]
결과

test 머신 사양입니다.
hp_ux 11.23, oracle 10.2.0.2

04 3 다 60
05 3 라 80
06 1 나 20
08 1 라 30
09 4 하 80

hp_ux11.31, oracle 10.2.0.4
01 1 가 30
02 2 라 50
03 2 다 50
04 3 다 60
05 3 라 80
06 1 나 20
08 1 라 30
09 4 하 80

즉 버그인건가요? 10.2.0.4에서 제대로 된 결과를 보여줍니다.
그래도 계층쿼리는 어렵다는 ㅎㅎ

by 마농 [2010.02.09 16:47:10]
음.. 버그가 맞는 모양이네요.
결과 올려주셔서 감사합니다.

by 마농 [2010.02.09 16:52:37]
버그를 피하기 위해 검색자료를 맨 위로 보낸뒤에 계층쿼리를 전개해 봤습니다.

WITH t2 AS
(
SELECT '01' pk, 1 aa, '가' bb, 30 cc FROM dual
UNION ALL SELECT '02', 2, '라', 50 FROM dual
UNION ALL SELECT '03', 2, '다', 50 FROM dual
UNION ALL SELECT '04', 3, '다', 60 FROM dual
UNION ALL SELECT '05', 3, '라', 80 FROM dual
UNION ALL SELECT '06', 1, '나', 20 FROM dual
UNION ALL SELECT '07', 9, '카', 99 FROM dual
UNION ALL SELECT '08', 1, '라', 30 FROM dual
UNION ALL SELECT '09', 4, '하', 80 FROM dual
)
, t3 AS
(
SELECT pk, aa, bb, cc
, CASE WHEN aa = 3 AND bb = '다' AND cc = 60 THEN 1 END flag
FROM t2
ORDER BY flag
)
SELECT DISTINCT pk, aa, bb, cc
FROM t3
START WITH flag = 1
CONNECT BY NOCYCLE PRIOR aa = aa
OR PRIOR bb = bb
OR PRIOR cc = cc
ORDER BY pk
;

by Ejql [2010.02.09 17:03:11]
감사합니다.

by 마농 [2010.02.10 00:28:49]
집에 설치한 버전입니다. 버그 없구요.
Window - 10g Express Edition Release 10.2.0.1.0
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입