首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在子查询中按组排列:慢速。使用视图会有所帮助,但这能在一个查询中完成吗?

在子查询中按组排列:慢速。使用视图会有所帮助,但这能在一个查询中完成吗?
EN

Stack Overflow用户
提问于 2012-06-25 11:13:13
回答 2查看 442关注 0票数 1

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

代码语言:javascript
复制
SELECT host,ip FROM arecords WHERE ip IN 
   (SELECT ip FROM arecords GROUP BY ip HAVING COUNT(ip)>1 )
;

(在我的记录表中,有时一个IP上有多个主机。对于这些情况,我想得到hostname+ip)

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

有一个查询的方法吗?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-25 11:33:57

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

在选择ips之后,您可以在相同的表上连接,其中ip等于在FROM子选择中选择的ip。连接应该是快速的,因为它将发生在索引上,最后的结果是,只有表中有多个值的hosts + ips才会得到:

代码语言:javascript
复制
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'
票数 6
EN

Stack Overflow用户

发布于 2012-06-25 11:35:05

代码语言:javascript
复制
SELECT host,ip 
FROM arecords ar 
WHERE EXISTS
    (SELECT * 
    FROM arecords ex
    WHERE ex.ip = ar.ip
    AND ex.host <> ar.host
    )
    ;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11188252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档