두 개의 테이블이 있습니다.
두 테이블 다 index 도 없고, pk도 없고, 모든 컬럼 null 허용 입니다.
tab_1 에 특정한 번호에 관한 데이터가 아래와 같이 있고,
user |
service |
service_opn |
phone |
serial |
홍길동 |
NN |
2006-01-01 |
010-1234-1234 |
|
홍길동 |
M3 |
2007-01-01 |
010-1234-1234 |
|
홍길동 |
M7 |
2009-01-01 |
010-1234-1234 |
|
tab_2에 같은 번호에 관한 데이터가 아래와 같이 있을 경우,
phone |
model |
serial |
service |
service_day |
010-1234-1234 |
|
987654 |
|
2006-01-01 |
010-1234-1234 |
s1010 |
번호없음 |
|
2007-01-01 |
010-1234-1234 |
s1111 |
번호없음 |
|
2009-01-01 |
이 두 개의 데이터를 조합하여 또 다른 테이블 tab_3에 insert를 해야 하는데
user |
phone |
model |
service |
service_opn |
serial |
service_day |
|
|
|
|
|
|
|
컬럼이 이렇게 지정되어 있을 경우, insert 되어야 하는 조건은 아래와 같습니다.
1. user, phone, service, service_opn 은 tab_1에서 phone번호로 조회하여
service_opn의 내림차순으로 정렬한 뒤 limit 1 로 제한한 데이터가 들어가야 합니다.
즉 홍길동, 010-1234-1234, M7, 2009-01-01 이 되겠죠.
2. model, serial, service_day 는 역시 같은 phone 번호로 tab_2를 검색하여 나온 데이터 들 중,
service_day 의 내림차순으로 정렬한 뒤 limit 1 로 들어가야 하지만,
상기 테이블 처럼 serial 의 값이 없을 경우에는,
(null 인 상태가 아니라, 지정 형식의 데이터가 아닌 다른 값이 들어가 있는 경우 포함)
지정 형식의 serial 값이 있는 row 의 데이터를 select 하여 그 값이 insert 되어야 합니다.
지정형식은 숫자로 된 6자리 데이터 입니다.
즉, 상기에 입력 되어 있는 3개의 데이터 모두가 정상적인 serial 값을 가지고 있다면
model , serial, service_day 는 s1111, '시리얼값', 2009-01-01 이 되겠지만
위 데이터 대로 입력이 되어 있는 상태라면
model , serial, service_day 는 '', 987654, 2006-01-01 이 되어야 합니다.
만약 tab_2 에서 3개의 데이터 중 service_day 가 2007-01-01 인 데이터에도
정상적인 serial이 들어가있고, 2009-01-01 만 데이터가 없다면
insert 되어야 할 데이터는 2006-01-01 의 serial 이 아니라 2007-01-01 의 serial 이 들어가야 하구요..
tab_2에 번호로 검색된 3개의 데이터가
전부다 정상적인 serial번호가 아닐 경우,
그때의 model , serial, service_day 는s1111, 번호없음, 2009-01-01
이런식으로 그냥 최근데이터가 들어가야 합니다..
전에 사용했던 쿼리는
SELECT A.user, A.phone, B.model, A.service, A.service_opn , B.serial, B.service_day
FROM (
SELECT * FROM tab_1 where phone ='010-1234-1234' order by service_opn desc limit 1
) A, (
select * from tab_2 where phone ='010-1234-1234'
and (
( length(serial) = 7 and (substring(serial, 2, 7) > '000000' or substring(serial, 2, 7) < '999999' ))
or ( length(serial) = 6 and (serial > '000000' or serial < '999999'))
) order by service_day desc limit 1 ) B
WHERE
A.phone = '010-1234-1234' and B.phone = A.phone
order by A.service_opn desc limit 1;
이렇게 했더니
내림차순의 최종 데이터의 serial 이 정상적이지 않을 경우에는 아예 row 가 나오지 않아서 수정이 필요합니다.
어떻게 하면 좋을까요..
|