用NOT IN等解释SQL查询

用NOT IN等解释SQL查询,sql,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

我有一个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'))

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

它返回所有事件的唯一callid,这些事件由指定的队列名称和日期过滤,包括CONNECT、About、,AGENTCALLBACKLOGOFF和AGENTCALLBACKLOGIN似乎您正在计算一次呼叫的呼叫数(通常是独占的),但它可以有许多来自voipwallboard\u ast\u queue\u日志的不同事件,但您不计算事件为“连接、放弃、AGENTCALLBACKLOGOFF、AGENTCALLBACKLOGIN”的呼叫数


您可以指定日期和队列名称。

它计算从:DATE开始的:queuename的不同调用,不包括在任何时间点或任何queuename发生“CONNECT”、“放弃”、“AGENTCALLBACKLOGOFF”、“AGENTCALLBACKLOGIN”事件的任何调用。

子查询:

从voipwallboard\u ast\u queue\u log表中选择CallID列表,其中事件为“CONNECT”、“放弃”、“AGENTCALLBACKLOGOFF”、“AGENTCALLBACKLOGIN”中的任意一个

主要查询:


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

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

WHERE event IN子句仅仅意味着仅选择事件属性为“CONNECT”、“READW”、“AGENTCALLBACLOGOFF”、“AGENTCALLBACLOGIN”之一的行

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

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

SELECT callid FROM voipwallboard_ast_queue_log 
WHERE event IN ('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)