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이 서로 종속관계가 아닌 독립적인 관계라면 필연적으로
발생할 수 밖에 없는 문제다.
항상 주의가 요구되는 문제라고 아니할 수 없겠다.
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이 서로 종속관계가 아닌 독립적인 관계라면 필연적으로
발생할 수 밖에 없는 문제다.
항상 주의가 요구되는 문제라고 아니할 수 없겠다.