1

运行此查询需要很长时间:

SELECT host,ip FROM arecords WHERE ip IN 
   (SELECT ip FROM arecords GROUP BY ip HAVING COUNT(ip)>1 )
;

(在我的arecords表中,有时一个IP上有多个主机。对于这些情况,我想获取主机名+ip)

我感觉子查询运行了很多次。如果我运行子查询,获取结果,并用这些结果替换子查询,速度很快。我发现我可以通过使用视图来避免这种情况。

有没有办法用一个查询来做到这一点?

[我想要的结果的示例 SQLfiddle:http ://sqlfiddle.com/#!2/6c1bd/1/0 ]

4

2 回答 2

6

试试这个解决方案。这将多次检索表中存在的每个 ip 的所有行。这使用了FROM一个子查询,它执行一次——而不是一个子查询,WHERE它为每个外行执行一次。

选择 s后ip,您将加入同一个表,其中 sip等于在子ip选择中选择的FROM表。连接应该很快,因为它会发生在索引上,最终结果是只有表中具有多个值的 s才会获得hosts + ips :ip

SELECT 
    b.host,
    b.ip
FROM
    (
        SELECT ip
        FROM arecords
        GROUP BY ip
        HAVING COUNT(*) > 1
    ) a
INNER JOIN
    arecords b ON a.ip = b.ip AND b.active = 'T'
于 2012-06-25T11:33:57.303 回答
2
SELECT host,ip 
FROM arecords ar 
WHERE EXISTS
    (SELECT * 
    FROM arecords ex
    WHERE ex.ip = ar.ip
    AND ex.host <> ar.host
    )
    ;
于 2012-06-25T11:35:05.930 回答