SQL IN BETWEEN。比较记录和范围(两个不同的表)

时间:2012-07-05 06:52:24

标签: sql relational-database between inet

我希望来自ip的记录不属于DHCP范围。 ip表有超过一万条记录,范围大约有千条。

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') 
);

(遗憾的是,这不适用于sqlfiddle(不支持inet_aton?))

这不起作用:

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

想法?

2 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点。最好的方法是使用LEFT JOIN / IS NULL,如此:

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

你可以做一个不相关的子查询:

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)

答案 1 :(得分:2)

SELECT i.ip 
FROM ip i 
WHERE NOT EXISTS (
   SELECT NULL
   FROM dhcprange d
   WHERE i.ip BETWEEN d.start AND d.end)
相关问题