首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >条件不同

条件不同
EN

Stack Overflow用户
提问于 2014-04-24 06:34:24
回答 2查看 175关注 0票数 2

很抱歉做了这么长时间的介绍,但我想说清楚我想做什么。如果有人能想出一个更合适的标题,请随时编辑。

我编写了一个SNMP收集器,它每小时查询数据中心的每个交换机一次,检查哪些端口在线,并将结果存储在MSSQL2K12 DB中。其动机是,管理员通常不会报告停止运行的服务器或其他设备,而且我们正在耗尽交换机端口。

DB模式如下(简化的屏幕截图):

接口表是爬行表的子表( cards =运行SNMP收集器)表,因为每个开关的接口数量不是固定的,而是爬行之间的变化,因为插入或删除行卡。

现在,我想编写一个查询,该查询将返回每个交换机上的每个接口,这些交换机的ifOperStatus值总是为2,而ifOperStatus值为1。

我写了一个有三个嵌套子查询的查询,读起来很难看,速度也很慢。肯定有更简单的方法。

我的方法是通过使用

代码语言:javascript
复制
HAVING        (COUNT(DISTINCT dbo.Interfaces.ifOperStatus) = 1)

并且,在最后一次爬行期间,与ifOperStatus为2的端口列表相比,内部连接更重要。很丑,就像我说的。

因此,来自DB的示例输出如下所示:

我正在寻找一个返回第5-7行的查询,因为ifOperStatus从未更改过,但由于ifOperStatus扇动而不返回第3-4行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-24 06:41:34

怎么样

代码语言:javascript
复制
HAVING (MIN(dbo.Interfaces.ifOperStatus) = 2 AND MAX(dbo.Interfaces.ifOperStatus) = 2)

MINMAX不要求Server维护到目前为止所看到的所有值,只是最高/最低值。这可能还避免了加入“在最后一次爬行时ifOperStatus为2的端口列表”的需要。

票数 3
EN

Stack Overflow用户

发布于 2014-04-24 06:57:48

代码语言:javascript
复制
select
    s.Hostname,
    s.sysDescr,
    i.ifOperStatus,
    i.ifAllias,
    i.ifIndex,
    i.ifDescr
from
    interfaces i
    join crawl c on c.id = i.crawlId
    join switches s on s.id = c.switchId
where
    i.ifOperStatus = 2
    and not exists
    (
        select 'x'
        from
            interfaces ii
            join crawl cc on cc.id = ii.crawlId
            join switches ss on ss.id = cc.switchId
        where
            s.id = ss.id
            and ii.ifOperStatus = 1
    )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23261499

复制
相关文章

相似问题

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