2012-07-05 3 views
0

ip의 DHCP 범위에없는 레코드를 원합니다. ip 테이블에는 약 1,000 개의 레코드가 있으며 범위는 약 1000입니다.SQL. 레코드 및 범위 비교 (두 개의 다른 테이블)

SELECT ip FROM ip WHERE ip NOT BETWEEN(SELECT start,end FROM dhcprange) 

아이디어 :

CREATE TABLE ip (ip int); 
CREATE TABLE dhcprange (start int,end int); 
INSERT INTO found_ips VALUES 
(INET_ATON('10.0.0.10')), 
(INET_ATON('10.0.0.11')), 
(INET_ATON('10.0.0.12')), 
(INET_ATON('10.0.0.51')), 
(INET_ATON('10.0.0.52') 
); 

INSERT INTO dhcpranges VALUES 
(INET_ATON('10.0.0.50'),INET_ATON('10.0.0.60'), 
(INET_ATON('10.0.0.70'),INET_ATON('10.0.0.100') 
); 

이 작동하지 않습니다 (? 이것은 불행하게도 (INET_ATON은 지원되지 않음) sqlfiddle에서 작동하지 않습니다)?

+1

http://sqlfiddle.com/#!2/d41d8/1047 - inet_aton은 sqlfiddle에서 지원되는 것으로 보입니다. 정확히 당신 한테 효과가 없었던 게 뭐죠? 여기에서 : http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton 나는 당신이 여기있는 것처럼 단순히 INT가 아닌 INT UNSIGNED를 사용해야한다는 것을 안다. 아마도 그것이 문제일까요? –

+0

이상한, thie 문제를 다시 만들 수 없습니다. 대답 해줘서 고마워. – Karlo

답변

2
SELECT i.ip 
FROM ip i 
WHERE NOT EXISTS (
    SELECT NULL 
    FROM dhcprange d 
    WHERE i.ip BETWEEN d.start AND d.end) 
을 당신은 비 상관 하위 쿼리를 할 수

SELECT ip 
FROM ip 
LEFT JOIN dhcpranges ON ip BETWEEN start AND end 
WHERE start IS NULL 

하십시오 LEFT JOIN/IS NULL과 같이 가장 좋은 방법은 사용하는 것

+0

Thans,이 작품은 (빠름)! – Karlo

2

몇 가지 방법으로이 작업을 수행 할 수 있습니다. 상관 하위 쿼리

SELECT ip 
FROM ip 
WHERE ip NOT IN (SELECT ip FROM ip INNER JOIN dhcpranges WHERE ip BETWEEN start AND end) 

또는 사용 :

SELECT a.ip 
FROM ip a 
WHERE NOT EXISTS (SELECT 1 FROM dhcpranges WHERE a.ip BETWEEN start AND end) 
+0

게시물을 업데이트했습니다. 감사합니다. 이것도 효과가 있습니다. 나는 이미 다른 대답을 받아 들였다. 내 upvote하고 감사드립니다! – Karlo