繁体   English   中英

SQL查询以选择其他行不等于值的位置

[英]SQL Query to select where other rows do not equal values

我正在尝试运行此查询:

SELECT arg2 as r 
FROM voipwallboard_ast_queue_log 
WHERE queuename = '0536*401'
      AND time > '2014-04-02 10:30:00'
      AND event = 'CONNECT'

而且在其他具有相同callid (列名)的行没有CONNECTABANDONRINGNOANSWER事件的RINGNOANSWER

例如,我有这些行:

callid  queuename    time                 event          arg2
1234    0536*401    2014-04-02 10:30:00   ENTERQUEUE     0192837465
1234    0536*401    2014-04-02 10:30:00   CONNECT
1234    0536*401    2014-04-02 10:30:00   RINGNOANSWER

因此,由于具有事件CONNECTRINGNOANSWER的行具有相同的callid ,因此arg2应该不会显示,但是如果后两行不存在,它将显示arg2

您需要将表加入自身。 尝试:

SELECT arg2 as r FROM voipwallboard_ast_queue_log v1
    WHERE queuename = '0536*401'
    AND time > '2014-04-02 10:30:00'
    AND event = 'CONNECT'
    AND NOT EXISTS (SELECT 1 FROM voipwallboard_ast_queue_log v2
                    WHERE v1.CallID = v2.CallID
                    AND v2.event in ('CONNECT','ABANDON ','RINGNOANSWER')
                    )

这是查询的可读版本:

SELECT arg2 as r 
FROM voipwallboard_ast_queue_log 
WHERE queuename = '0536*401'
      AND time > '2014-04-02 10:30:00'
      AND callid NOT IN ( select callid 
                          from voipwallboard_ast_queue_log
                          where event not in ( 'CONNECT', 'ABANDON', 
                                               'RINGNOANSWER' )
                         )

但是性能并不是最好的,因为它会检查每一行的子查询。

为了提高性能,您应该保留连接表本身:

SELECT l.arg2 as r 
FROM voipwallboard_ast_queue_log l left outer join
    ( select callid 
                          from voipwallboard_ast_queue_log
                          where event not in ( 'CONNECT', 'ABANDON', 
                                               'RINGNOANSWER' )
                         )  T
       on l.callid = T.callid
WHERE l.queuename = '0536*401'
      AND l.time > '2014-04-02 10:30:00'
      AND t.callid is null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM