用NOT IN等解释SQL查询

时间:2014-03-28 12:13:58

标签: sql

我有这个SQL查询:

SELECT COUNT(DISTINCT callid) as r 
FROM voipwallboard_ast_queue_log 
        WHERE queuename = :queuename 
        AND time > :date 
        AND callid NOT IN (
             SELECT callid FROM voipwallboard_ast_queue_log 
             WHERE event IN ('CONNECT', 'ABANDON', 
                             'AGENTCALLBACKLOGOFF', 'AGENTCALLBACKLOGIN'))

但我需要确切地知道它在做什么,有人能告诉我吗?

5 个答案:

答案 0 :(得分:0)

它会返回指定callidqueuename过滤的所有唯一 date所有事件CONNECTABANDON },AGENTCALLBACKLOGOFFAGENTCALLBACKLOGIN

答案 1 :(得分:0)

似乎你正在计算来自voipwallboard_ast_queue_log的callid(通常是一次调用专用但它可以有许多不同的事件),但是你没有计算其事件是'CONNECT,ABANDON,AGENTCALLBACKLOGOFF,AGENTCALLBACKLOGIN)的callid

您可以指定DATE和队列名称。

答案 2 :(得分:0)

它计算a:queuename的不同调用:截止日期,并排除任何在任何时间点发生'CONNECT', 'ABANDON', 'AGENTCALLBACKLOGOFF', 'AGENTCALLBACKLOGIN'事件或任何queuename的调用。

答案 3 :(得分:0)

子查询:

SELECT callid FROM voipwallboard_ast_queue_log 
WHERE event IN ('CONNECT', 'ABANDON', 'AGENTCALLBACKLOGOFF', 'AGENTCALLBACKLOGIN')

从voipwallboard_ast_queue_log表中选择callid列表,其中event是'CONNECT', 'ABANDON', 'AGENTCALLBACKLOGOFF', 'AGENTCALLBACKLOGIN'中的任何一个

主要查询:

SELECT COUNT(DISTINCT callid) as r 
FROM voipwallboard_ast_queue_log 
    WHERE queuename = :queuename 
    AND time > :date 
    AND callid NOT IN (Sub query)

选择不在子查询结果中的callid和其他条件的callid的不同计数。

答案 4 :(得分:0)

因此内部查询(称为子查询)将首先运行,并返回单个列(callid)表,您可以对其运行更多查询。

WHERE事件IN子句只是意味着只选择事件属性是其中之一的行(' CONNECT',' ABANDON',' AGENTCALLBACKLOGOFF', ' AGENTCALLBACKLOGIN'。)

一旦该查询返回单列表,外部查询将返回返回的行数,其中queuename是您指定的queuename,它大于您指定的日期,并且callid确实不显示在上一个查询中。

您还使用了DISTINCT关键字,因此重复行将从计数中排除。