데이타 비교 쿼리 질문 0 4 1,161

by 손님 [SQL Query] 비교 [2009.12.31 07:34:41]


 

안녕하세요~ DB 입문한지 얼마 안된 초심자 인데요

아래와 같은 쿼리를 작성하다가 잘 안되서 질문드려요 ㅠㅠ

제품테이블 A  (PK: 제품번호, 일련번호)
제품번호 일련번호 제품규격 제품사이즈 제조년도 사용여부
    1            1          A1       150         2009       N
    1            2          A1       150         2009       N
    1            3          A1       150         2009       Y
    2            1          A1       100         2009       N
    2            2          A1       100         2009       N
    2            3          A1       100         2009       Y

제품상세테이블 B (PK:제품번호, 일련번호)
제품번호 일련번호 제품코드1 제품코드2 제품코드3  .....
    1            1          111       112         113   
    1            2          111       112         113   
    1            3          114       211         315  
    2            1          111       112         113   
    2            2          111       112         113   
    2            3          114       211         315  

이런형태로 테이블이 구성되어있는데요

제품규격이 'A1' 이면서 사용여부가 'Y' 인 제품코드와
제품규격이 'A1' 이면서 사용여부가 'Y' 의 윗단계에 있는 일련번호의 (여기에서는 일련번호 2)
제품코드(제품코드1,2,3)가 서로 다른 모든 제품번호를 찾아야 합니다.

쉽게 될거 같은데.. 어제 내내 삽질하다가 질문올립니다;;

제품규격이 'A1' 이면서 사용여부가 'Y' 인 제품코드를 조회하고,
제품규격이 'A1' 이면서 사용여부가 'Y' 의 윗단계에 있는 일련번호의 제품코드를 조회한 후
비교하면 될거 같은데..

따로 따로는 구했는데.. 이걸 비교하려니 머리가 안돌아가네요 ㅠㅠ

 

by 빈이 [2009.12.31 09:18:37]
일단 따로 하신거 union all 하셔도 되는데 '')

by 서성우 [2009.12.31 09:51:52]
WITH test AS
(
SELECT '1' j_no , '1' s_no , 'A1' law , '150' siz , '2009' yer , 'N' gu FROM dual UNION ALL
SELECT '1' , '2' , 'A1' , '150' , '2009' , 'N' FROM dual UNION ALL
SELECT '1' , '3' , 'A1' , '150' , '2009' , 'Y' FROM dual UNION ALL
SELECT '1' , '4' , 'A1' , '150' , '2009' , 'N' FROM dual UNION ALL
SELECT '1' , '5' , 'A1' , '150' , '2009' , 'Y' FROM dual UNION ALL
SELECT '2' , '1' , 'A1' , '100' , '2009' , 'N' FROM dual UNION ALL
SELECT '2' , '2' , 'A1' , '100' , '2009' , 'N' FROM dual UNION ALL
SELECT '2' , '3' , 'A1' , '100' , '2009' , 'Y' FROM dual

)
, test2 AS
(
SELECT '1' j_no , '1' s_no , '111' code1 , '112' code2 , '113' code3 FROM dual UNION ALL
SELECT '1' , '2' , '111' , '112' , '113' FROM dual UNION ALL
SELECT '1' , '3' , '114' , '211' , '315' FROM dual UNION ALL
SELECT '1' , '4' , '111' , '112' , '113' FROM dual UNION ALL
SELECT '1' , '5' , '123' , '456' , '789' FROM dual UNION ALL
SELECT '2' , '1' , '111' , '112' , '113' FROM dual UNION ALL
SELECT '2' , '2' , '111' , '112' , '113' FROM dual UNION ALL
SELECT '2' , '3' , '114' , '211' , '315' FROM dual
)
SELECT * FROM
(SELECT a.j_no,
a.s_no,
a.law,
a.siz,
a.yer,
a.gu,
b.code1,
b.code2,
b.code3,
Decode(a.gu,'Y',Lag(b.code1) over(PARTITION BY b.j_no ORDER BY b.j_no,b.s_no)) code1_1,
Decode(a.gu,'Y',Lag(b.code2) over(PARTITION BY b.j_no ORDER BY b.j_no,b.s_no)) code2_1,
Decode(a.gu,'Y',Lag(b.code3) over(PARTITION BY b.j_no ORDER BY b.j_no,b.s_no)) code3_1
FROM test a, test2 b
WHERE a.j_no = b.j_no
AND a.s_no = b.s_no)
WHERE (code1 <> code1_1 OR code2 <> code2_1 OR code3 <> code3_1)

이런걸 원하시는 것 같은데
제가 잘 알아들었는지 모르겠네요

by 서성우 [2009.12.31 09:53:35]
만약 사용여부 Y가 연속으로 나오는 경우가 있다면
쿼리에 연속으로 나올때의 처리도 추가로 해주셔야 겠지요..

by 글쓴이 [2010.01.06 15:25:07]
감사 인사가 너무 늦었습니다. 감사합니다. 많은 도움됐습니다 (__) 꾸벅~
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입