메뉴 건너뛰기

tnt_db

Oracle PAIRWISE 와 NONPAIRWISE

운영자 2002.09.18 14:26 조회 수 : 2597 추천:14

CREATE TABLE  TEST09 (공정  VARCHAR2(3),
                      SPEC  VARCHAR2(10),
                      부품  VARCHAR2(8),
                      갯수    NUMBER,
                      CONSTRAINT TEST09_PK PRIMARY KEY (공정,SPEC,부품)
                     );
INSERT INTO TEST09 VALUES('01','A001','P01',1);                                      
INSERT INTO TEST09 VALUES('01','A001','P03',1);                                      
INSERT INTO TEST09 VALUES('01','A001','P04',1);                                      
INSERT INTO TEST09 VALUES('01','A001','P07',1);                                      
INSERT INTO TEST09 VALUES('01','A001','P08',1);                                      
INSERT INTO TEST09 VALUES('01','A002','P02',4);                                      
INSERT INTO TEST09 VALUES('01','A002','P04',4);                                      
INSERT INTO TEST09 VALUES('01','A002','P05',4);                                      
INSERT INTO TEST09 VALUES('01','A002','P07',4);                                      
INSERT INTO TEST09 VALUES('01','A002','P08',4);                                      
INSERT INTO TEST09 VALUES('01','A003','P01',3);                                      
INSERT INTO TEST09 VALUES('01','A003','P03',3);                                      
INSERT INTO TEST09 VALUES('01','A003','P04',3);                                      
INSERT INTO TEST09 VALUES('01','A003','P06',3);                                      
INSERT INTO TEST09 VALUES('01','A003','P07',3);                                      
INSERT INTO TEST09 VALUES('01','A004','P02',2);                                      
INSERT INTO TEST09 VALUES('01','A004','P03',2);                                      
INSERT INTO TEST09 VALUES('01','A004','P05',2);                                      
INSERT INTO TEST09 VALUES('01','A004','P06',2);                                      
INSERT INTO TEST09 VALUES('01','A004','P07',2);                                      
INSERT INTO TEST09 VALUES('02','A001','P02',2);                                      
INSERT INTO TEST09 VALUES('02','A001','P05',2);                                      
INSERT INTO TEST09 VALUES('02','A001','P06',2);                                      
INSERT INTO TEST09 VALUES('02','A001','P09',2);                                      
INSERT INTO TEST09 VALUES('02','A001','P10',2);                                      
INSERT INTO TEST09 VALUES('02','A002','P01',1);                                      
INSERT INTO TEST09 VALUES('02','A002','P03',1);                                      
INSERT INTO TEST09 VALUES('02','A002','P06',1);                                      
INSERT INTO TEST09 VALUES('02','A002','P09',1);                                      
INSERT INTO TEST09 VALUES('02','A002','P10',1);                                      
INSERT INTO TEST09 VALUES('02','A003','P02',4);                                      
INSERT INTO TEST09 VALUES('02','A003','P05',4);                                      
INSERT INTO TEST09 VALUES('02','A003','P08',4);                                      
INSERT INTO TEST09 VALUES('02','A003','P09',4);                                      
INSERT INTO TEST09 VALUES('02','A003','P10',4);                                      
INSERT INTO TEST09 VALUES('02','A004','P01',3);                                      
INSERT INTO TEST09 VALUES('02','A004','P04',3);                                      
INSERT INTO TEST09 VALUES('02','A004','P08',3);                                      
INSERT INTO TEST09 VALUES('02','A004','P09',3);                                      
INSERT INTO TEST09 VALUES('02','A004','P10',3);                                      
INSERT INTO TEST09 VALUES('03','A001','P01',3);                                      
INSERT INTO TEST09 VALUES('03','A001','P03',3);                                      
INSERT INTO TEST09 VALUES('03','A001','P11',3);                                      
INSERT INTO TEST09 VALUES('03','A001','P13',3);                                      
INSERT INTO TEST09 VALUES('03','A001','P15',3);                                      
INSERT INTO TEST09 VALUES('03','A002','P01',2);                                      
INSERT INTO TEST09 VALUES('03','A002','P02',2);                                      
INSERT INTO TEST09 VALUES('03','A002','P13',2);                                      
INSERT INTO TEST09 VALUES('03','A002','P15',2);                                      
INSERT INTO TEST09 VALUES('03','A002','P16',2);                                      
INSERT INTO TEST09 VALUES('03','A003','P01',1);                                      
INSERT INTO TEST09 VALUES('03','A003','P08',1);                                      
INSERT INTO TEST09 VALUES('03','A003','P11',1);                                      
INSERT INTO TEST09 VALUES('03','A003','P12',1);                                      
INSERT INTO TEST09 VALUES('03','A003','P13',1);                                      
INSERT INTO TEST09 VALUES('03','A004','P01',4);                                      
INSERT INTO TEST09 VALUES('03','A004','P07',4);                                      
INSERT INTO TEST09 VALUES('03','A004','P09',4);                                      
INSERT INTO TEST09 VALUES('03','A004','P11',4);                                      
INSERT INTO TEST09 VALUES('03','A004','P12',4);
--
CREATE TABLE TEST10 (일자      VARCHAR2(8)  NOT NULL,
                     투입순서  VARCHAR2(3)  NOT NULL,
                     공정      VARCHAR2(3)  NOT NULL,
                     SPEC      VARCHAR2(10) NOT NULL,
                     CONSTRAINT TEST10_PK  
                                PRIMARY KEY (일자,투입순서,공정,SPEC)
                    );
INSERT INTO TEST10 VALUES ('19990203','01','01','A001');        
INSERT INTO TEST10 VALUES ('19990203','01','03','A001');        
INSERT INTO TEST10 VALUES ('19990203','02','01','A002');        
INSERT INTO TEST10 VALUES ('19990203','01','02','A002');        
INSERT INTO TEST10 VALUES ('19990203','02','02','A003');        
INSERT INTO TEST10 VALUES ('19990203','02','03','A003');        
INSERT INTO TEST10 VALUES ('19990203','03','01','A001');        
INSERT INTO TEST10 VALUES ('19990203','03','03','A001');        
INSERT INTO TEST10 VALUES ('19990203','04','01','A002');        
INSERT INTO TEST10 VALUES ('19990203','03','02','A002');        
INSERT INTO TEST10 VALUES ('19990203','04','02','A003');        
INSERT INTO TEST10 VALUES ('19990203','04','03','A003');        
INSERT INTO TEST10 VALUES ('19990203','05','01','A001');        
INSERT INTO TEST10 VALUES ('19990203','05','03','A001');        
INSERT INTO TEST10 VALUES ('19990203','06','01','A002');        
INSERT INTO TEST10 VALUES ('19990203','05','02','A002');        
INSERT INTO TEST10 VALUES ('19990203','06','02','A003');        
INSERT INTO TEST10 VALUES ('19990203','06','03','A003');        
INSERT INTO TEST10 VALUES ('19990203','07','01','A001');        
INSERT INTO TEST10 VALUES ('19990203','07','03','A001');        
INSERT INTO TEST10 VALUES ('19990203','08','01','A002');        
INSERT INTO TEST10 VALUES ('19990203','07','02','A002');        
INSERT INTO TEST10 VALUES ('19990203','08','02','A003');        
INSERT INTO TEST10 VALUES ('19990203','08','03','A003');        
INSERT INTO TEST10 VALUES ('19990203','09','01','A001');        
INSERT INTO TEST10 VALUES ('19990203','09','03','A001');        
INSERT INTO TEST10 VALUES ('19990203','10','01','A002');        
INSERT INTO TEST10 VALUES ('19990203','09','02','A002');        
INSERT INTO TEST10 VALUES ('19990203','10','02','A003');        
INSERT INTO TEST10 VALUES ('19990203','10','03','A003');  
--

Pairwise & Nonpairwise

조건.
    TABLE : TEST09

    열 이름                        널?      유형
    ------------------------------ -------- ----
    공정                                    VARCHAR2(3)
    SPEC                                    VARCHAR2(10)
    부품                                    VARCHAR2(8)
    갯수                                    NUMBER

    TABLE : TEST10

    열 이름                        널?      유형
    ------------------------------ -------- ----
    일자                                    VARCHAR2(8)
    공정                                    VARCHAR2(3)
    투입순서                                VARCHAR2(3)
    SPEC                                    VARCHAR2(10)

    공정  SPEC       부품   갯수        일자     공정 투입순서 SPEC      
    ----  ------     ------ ----        -------- ---- -------- ------
    01    A001       P01       1        19990203 01   01       A001      
    01    A001       P03       1        19990203 01   02       A002      
    01    A001       P04       1        19990203 01   03       A001      
    01    A001       P07       1        19990203 01   04       A002      
    01    A001       P08       1        19990203 01   05       A001      
    01    A002       P02       4        19990203 01   06       A002      
    01    A002       P04       4        19990203 01   07       A001      
    01    A002       P05       4        19990203 01   08       A002      
    01    A002       P07       4        19990203 01   09       A001      
    01    A002       P08       4        19990203 01   10       A002      
    01    A003       P01       3        19990203 02   01       A002      
    01    A003       P03       3        19990203 02   02       A003      
    01    A003       P04       3        19990203 02   03       A002      
    01    A003       P06       3        19990203 02   04       A003      
    01    A003       P07       3        19990203 02   05       A002      
    01    A004       P02       2        19990203 02   06       A003      
    01    A004       P03       2        19990203 02   07       A002      
    01    A004       P05       2        19990203 02   08       A003      
    01    A004       P06       2        19990203 02   09       A002      
    01    A004       P07       2        19990203 02   10       A003      
    02    A001       P02       2        19990203 03   01       A001      
    02    A001       P05       2        19990203 03   02       A003      
    02    A001       P06       2        19990203 03   03       A001      
    02    A001       P09       2        19990203 03   04       A003      
    02    A001       P10       2        19990203 03   05       A001      
    02    A002       P01       1        19990203 03   06       A003      
    02    A002       P03       1        19990203 03   07       A001      
    02    A002       P06       1        19990203 03   08       A003      
    02    A002       P09       1        19990203 03   09       A001      
    02    A002       P10       1        19990203 03   10       A003      
    02    A003       P02       4          
    02    A003       P05       4            
    02    A003       P08       4            
    02    A003       P09       4            
    02    A003       P10       4            
    02    A004       P01       3            
    02    A004       P04       3            
    02    A004       P08       3            
    02    A004       P09       3            
    02    A004       P10       3            
    03    A001       P01       3            
    03    A001       P03       3            
    03    A001       P11       3            
    03    A001       P13       3            
    03    A001       P15       3            
    03    A002       P01       2            
    03    A002       P02       2            
    03    A002       P13       2            
    03    A002       P15       2            
    03    A002       P16       2            
    03    A003       P01       1            
    03    A003       P08       1            
    03    A003       P11       1            
    03    A003       P12       1            
    03    A003       P13       1            
    03    A004       P01       4            
    03    A004       P07       4            
    03    A004       P09       4            
    03    A004       P11       4            
    03    A004       P12       4            
    
문제.
    조건에서 처럼 두개의 서로다른 TABLE에 위와같은 DATA가 들어있다.
    TEST09는 각 공정별로 특정SPEC을 생산하기 위하여 필요한 부품과
    부품의 갯수에 대한정보를 담고 있다.
    반면 TEST10에는 각 일자별로 특정공정의 투입순서별 SPEC에 대한
    정보가 담겨 있다. 그중 1999년02월03일의 예상투입정보만 읽어왔다.
    요구하는 정보는 1999년02월03일에 쓰이는 부품의 LIST만을 보고싶다.
    실제 상황에는 부품별 소요갯수 등의 정보가 필요한 경우가
    더 많겠지만, 주제의 이해를 돕기위해 갯수를 제외한 필요부품 LIST
    만을 뽑아보자.

생각.
    주의깊은 생각을 요구하는 문제는 아니다.
    하지만 실수를 유발시키는 부분을 내포하고 있는 문제다.
    엿보기1.TEST10의 일자가 '19990203'인 DATA중 공정과 SPEC에관한
            정보만 가지고 TEST09를 읽어오면 된다.
    엿보기2.
            이과정에서 사용할 수 있는방법은
            먼저 두개 TABLE의 JOIN을 이용하여 부품만을 UNIQUE하게
            읽어서 처리하는 방법이 있을것이고,
            TEST10에서 공정별로 투입되는 SPEC정보를 SUBQUERY해서
            공정과 SPEC이 그중에 포함되는 DATA의 부품만을 DISTINCT
            하게 읽어오는 방법이 있을 수 있다.

해법.
    단계1.가장 쉽게 생각할 수 있는 방법이다.
         SELECT DISTINCT 부품
         FROM   TEST09 A,TEST10 B
         WHERE  B.일자 = '19990203'
         AND    A.공정 = B.공정
         AND    A.SPEC = B.SPEC
         결과는 아래와 같다.

         부품    
         --------
         P01    
         P02    
         P03    
         P04    
         P05    
         P06    
         P07    
         P08    
         P09    
         P10    
         P11    
         P12    
         P13    
         P15    
         14 행이 선택되었습니다
    단계2.다음 방법은 SUBQUERY 를 이용하는 방법이 있을 수 있다.
          다음과 같이 쓰면 될까?.

          SELECT DISTINCT 부품
          FROM   TEST09
          WHERE  공정 IN (SELECT 공정
                          FROM   TEST10 WHERE 일자 = '19990203')
          AND    SPEC IN (SELECT SPEC
                          FROM   TEST10 WHERE 일자 = '19990203')
          결과는 어떻게 나올까?.
          잠시 생각해 보자 결과가 제대로 나올까 하는 문제를...
          결과는 아래와 같다.

          부품    
          --------
          P01    
          P02    
          P03    
          P04    
          P05    
          P06    
          P07    
          P08    
          P09    
          P10    
          P11    
          P12    
          P13    
          P15    
          P16    
          15 행이 선택되었습니다          
    단계3.그렇다면 다음 방법은 어떻겠는가?..

          SELECT DISTINCT 부품
          FROM   TEST09
          WHERE  (공정,SPEC) IN (SELECT 공정,SPEC  
                                 FROM TEST10
                                 WHERE 일자 = '19990203')
          이렇게 하면 단계2와는 결과가 같을까? 다를까?...
          결과를 보자.

          부품    
          --------
          P01    
          P02    
          P03    
          P04    
          P05    
          P06    
          P07    
          P08    
          P09    
          P10    
          P11    
          P12    
          P13    
          P15    
          14 행이 선택되었습니다.
     단계4.단계1과 단계3은 같은 결과이고 단계2만 다르니까 1과3이
           맞고 단계2는 틀리는가?...
           아니면 그 반대인가?..
           DATA를 분석해보자
           단계2에서 차이나는 RECORD는 부품번호 'P16'이다.
           'P16'은 어떤공정의 어떤 SPEC을 생산하는데 필요한지
           알아보자.
           정확히 한군데서만 쓰고 있다.
           '03'번 공정에서 'A002' SPEC을 생산하는 경우에만 2개가
           쓰이고 있다.
           그렇다면 '19980203'인 일자에는 '03'공정에서 'A002' SPEC을
           생산할 계획을 가지고 있는가 보자.
           없다.
           해당일의 '03'번 공정에서는 'A002' SPEC을 생산할
           계획이 없다.
           그렇다면 답은 결정되었다.
           단계2 는 맞는 답이 아니다.
뒷풀이.
     그렇다면 단계2가 왜 틀렸는지 생각해 볼 필요가 있다.
     답을 놓고 거꾸로 문제를 생각해 보면 당연히 그렇게 될 수 밖에
     없다는 것을 알 수 있을 것이다.
     먼저 해당일에 생산이 일어나는 공정을 먼저 다 읽어보면
     '01','02','03' 공정이다.
     그리고 해당일에 생산이되는 SPEC을 보면 'A001','A002',
     'A003' 이다.
     두개를 AND 로 연결시키면 공정이 '01','02','03' 공정에 포함되고
     SPEC이 'A001','A002','A003'  에 포함되는 DATA는 모두 포함된다.
     하지만 정확한 결과는 아니다.
     공정과 SPEC이 마치 하나의 COLUMN인것과 같이 조건이 걸려야 한다.
     공정과 SPEC이 서로 종속관계가 아닌 독립적인 관계라면 필연적으로
     발생할 수 밖에 없는 문제다.
     항상 주의가 요구되는 문제라고 아니할 수 없겠다.
위로