SQL join을 하면 중복된 결과가 나옵니다.
아래와 같이 테이블 2개가 있을 때 조인으로 결과를 얻어오려고 합니다.
Table A
+---------------------+-------------+---------+----------+
| acctime | ip | insize | outsize |
+---------------------+-------------+---------+----------+
| 2010-02-14 00:51:42 | 192.168.1.1 | 10252 | 4507 |
| 2010-02-14 00:51:42 | 192.168.1.1 | 0 | 0 |
| 2010-02-14 00:51:42 | 192.168.1.1 | 0 | 0 |
| 2010-02-14 00:51:42 | 192.168.1.1 | 0 | 0 |
| 2010-02-14 00:51:43 | 192.168.1.1 | 0 | 0 |
| 2010-02-14 00:51:43 | 192.168.1.1 | 1129 | 447 |
| 2010-02-14 00:51:43 | 192.168.1.1 | 0 | 0 |
| 2010-02-14 00:51:43 | 192.168.1.1 | 0 | 0 |
| 2010-02-14 00:51:43 | 192.168.1.1 | 0 | 0 |
| 2010-02-14 00:51:43 | 192.168.1.1 | 0 | 0 |
| 2010-02-14 00:51:43 | 192.168.1.1 | 0 | 0 |
| 2010-02-14 00:51:43 | 192.168.1.1 | 0 | 0 |
| 2010-02-14 00:51:44 | 192.168.1.1 | 0 | 0 |
| 2010-02-14 00:51:44 | 192.168.1.1 | 0 | 0 |
| 2010-02-14 00:51:44 | 192.168.1.1 | 35 | 35 |
+---------------------+-------------+---------+----------+
(총 15개)
Table B
+---------------------+-----------------+
| starttime | myipaddress |
+---------------------+-----------------+
| 2010-02-12 17:01:56 | 192.168.1.3 |
| 2010-02-12 16:03:38 | 192.168.1.2 |
| 2010-02-12 16:03:05 | 192.168.1.1 |
| 2010-02-12 15:57:50 | 192.168.1.1 |
| 2010-02-12 17:28:30 | 192.168.1.1 |
| 2010-02-12 17:54:43 | 192.168.1.1 |
| 2010-02-12 18:17:22 | 192.168.1.1 |
| 2010-02-13 11:26:39 | 192.168.1.1 |
| 2010-02-13 16:03:05 | 192.168.1.1 |
| 2010-02-13 19:34:11 | 192.168.1.1 |
| 2010-02-13 23:05:21 | 192.168.1.1 |
| 2010-02-14 00:50:17 | 192.168.1.1 |
+---------------------+-----------------+
SELECT A.* FROM A, B WHERE A.ip=B.myipaddress;
을 하면, 결과가 중복되어서 150개가 나옵니다.
의도하는 것은 15개가 나와야 하는데, A의 갯수 * 10 (B에서 192.168.1.1 갯수)이 나오네요.
---
실제로 수행하려는 질의는
SELECT A.* FROM A, B WHERE A.ip=B.myipaddress and A.acctime >= B.starttime
입니다.
테이블 A는 웹 캐쉬 서버 로그, 테이블 B는 DHCP 로그인데,
해당 아이피로 들어온 사람이 캐쉬 서버에서 데이터를 받아간 내역을 뽑으려고 하는거구요.
정상적인
정상적인 동작이고요.
어떤 결과셋이 정답인지 알기 어렵지만 의도하신 결과셋이 B에 들어있는 IP가 포함된 A테이블의 결과만 나오길 원하시면
SELECT * FROM A WHERE A.ip IN (SELECT myipaddress FROM B)
이걸 응용해보세요.
댓글 달기