database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 29147 게시물 읽기
No. 29147
테이블 join시 문의사항 입니다.
작성자
오은혜(goodohne)
작성일
2009-07-14 11:58ⓒ
2009-07-16 10:45ⓜ
조회수
6,253

두 개의 테이블이 있습니다.

두 테이블 다 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 가 나오지 않아서 수정이 필요합니다.


어떻게 하면 좋을까요..

이 글에 대한 댓글이 총 6건 있습니다.

일단 제시해주신 쿼리문의 중간에 phone이 010-1234-1234가 아닌 다른 값이 들어가 있는데, 이게 정상적인 쿼리인지요?

만약 두 값이 같아야 했다면 제일 외부의 where 구문 (phone 번호 비교) 가 필요 없는 것 같아 보입니다.

박현우(lqez)님이 2009-07-14 16:26에 작성한 댓글입니다.

앗;;


오타입니다..

실제 사용되는 전화번호라서 지우고 임의의 번호로 수정을 한 거였는데

그 중간에 있는 번호만 수정이 안되어 있었군요..


본문에 있는 번호도 수정하였습니다

오은혜(goodohne)님이 2009-07-14 17:40에 작성한 댓글입니다.

제가 위의 댓글을 달던 당시의 쿼리 구문으로는, 원하셨던 결과가 잘 나왔던 것으로 기억이 됩니다.

(phone값을 동일하게 했을 떄)

 

결과가 나오지 않는 경우의 예를 들어주시면 문제를 이해하기에 좋을 것 같습니다만...

 

박현우(lqez)님이 2009-07-15 18:12에 작성한 댓글입니다.

아 이런 ㅠㅠ 죄송합니다..
도움을 요청해 놓구서 본문에 중요한 걸 빠트렸네요;;

본문에는 tab_2 의 데이터가
어느 하나라도 serial 이 제대로 들어가 있는 경우만 설명해 놓은거구요;

tab_2에 번호로 검색된 3개의 데이터가
전부다  정상적인 serial번호가 아닐 경우,
그때의 model , serial, service_day 는s1111, 번호없음, 2009-01-01
이런식으로 그냥 최근데이터가 들어가야 합니다..

저 쿼리대로만 한다면
데이터는 있지만 serial번호가 없는 경우에는 검색결과가 안나와서
애먹고 있는중입지요..

오은혜(goodohne)님이 2009-07-16 10:43에 작성한 댓글입니다.

아래 제가 테스트한 결과를 참고하시면 도움이 되지 않을까요?

보시면 아시겠지만, 

(1) 시리얼이 있으면서 최신의 정보 1개
(2) 시리얼의 존재 여부와 관계 없는 최신의 정보 1개

(1)+(2)를 union 해서 하나를 고르게 쿼리를 해보았습니다.

tab_1과 동시에 보여주는 것은 어려운 문제가 아니므로 생략했습니다.

------------------------

mysql> select * from tab_2;
+---------------+-------+--------+---------+-------------+
| phone         | model | serial | service | service_day |
+---------------+-------+--------+---------+-------------+
| 010-1234-1234 | NULL  | 987654 | NULL    | 2006-01-01  |
| 010-1234-1234 | s1010 | NULL   | NULL    | 2007-01-01  |
| 010-1234-1234 | s1111 | NULL   | NULL    | 2009-01-01  |
+---------------+-------+--------+---------+-------------+
3 rows in set (0.00 sec)

mysql> select * from ( ( select * from tab_2 where serial is not null order by service_day desc limit 1) union all ( select * from tab_2 order by service_day desc limit 1) ) a limit 1;
+---------------+-------+--------+---------+-------------+
| phone         | model | serial | service | service_day |
+---------------+-------+--------+---------+-------------+
| 010-1234-1234 | NULL  | 987654 | NULL    | 2006-01-01  |
+---------------+-------+--------+---------+-------------+
1 row in set (0.00 sec)

mysql> update tab_2 set serial = null;
Query OK, 1 row affected (0.00 sec)
Rows matched: 3  Changed: 1  Warnings: 0

mysql> select * from ( ( select * from tab_2 where serial is not null order by service_day desc limit 1) union all ( select * from tab_2 order by service_day desc limit 1) ) a limit 1;
+---------------+-------+--------+---------+-------------+
| phone         | model | serial | service | service_day |
+---------------+-------+--------+---------+-------------+
| 010-1234-1234 | s1111 | NULL   | NULL    | 2009-01-01  |
+---------------+-------+--------+---------+-------------+
1 row in set (0.01 sec)

mysql>

박현우(lqez)님이 2009-07-16 16:21에 작성한 댓글입니다.

감사합니다 ^^
적어주신 쿼리를 참조해서 해봤더니 제가 원하는 결과가 나왔어요 ^^

평소에 주로 사용하는 것들만 머리에 떠올라서 union 이란걸 잊었네요..

좋은 주말 보내세요~

오은혜(goodohne)님이 2009-07-17 18:04에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
29157#1064 - 'SQL 구문에 오류가 있습니다.' 에러 같읍니다. [3]
최규진
2009-07-15
139521
29156정렬방법 [1]
김성민
2009-07-15
5484
29148query 질문 하나 드립니다 [1]
최종우
2009-07-14
5717
29147테이블 join시 문의사항 입니다. [6]
오은혜
2009-07-14
6253
29146insert할때 auto increment 되는 현재값을 구하는 방법 질문입니다.. 꼭 봐주세요 [2]
...
2009-07-14
6684
29145정렬하기 문제 [1]
조항철
2009-07-14
5368
29144질문드리겠습니다. [1]
질문
2009-07-14
6732
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다