试图将“不在”语句转换为“不存在” - 我已经查看了相关问题,但仍无法使其工作

时间:2015-03-31 18:22:53

标签: tsql

我的前老板给我留下了一个简单的查询。它使用了一个非常长的时间(并且由于尚未确定的原因导致服务器上的故障转移仅运行一个数据库)。我试图将其更改为不存在,并且我返回了0条记录。我知道它必须是简单的东西,但这里绝对没有人知道我在说什么。

以下是查询:

declare @Callback table (ProspectRelationCode varchar(1), CallbackAvail int)
insert into @Callback

select
opp.ppc as ProspectRelationCode,
sum(case when dl.Category = 'Refusal' 
    then 1 else 0
end) as CallbackAvail

from CallResult cr
join Opportunity opp
on opp.id = cr.ID
join dbo.DispositionLookup dl
on dl.lookupkey = cr.CallStatus
where dl.Category = 'Refusal' and opp.Assignment not in (
select Assignment from CallResult cr 
join Opportunity opp
on opp.id = cr.ID
where cr.CallStatus in ('VVOL','RVOL')  )
and  opp.listid >= 1400
group by opp.ppc

这是我的(轻微)返工:

select
    opp.ppc as ProspectRelationCode,
    sum(case when dl.Category = 'Refusal' 
        then 1 else 0
    end) as CallbackAvail

from CallResult cr
join Opportunity opp
    on opp.id = cr.ID
join dbo.DispositionLookup dl
    on dl.lookupkey = cr.CallStatus
where dl.Category = 'Refusal' and not exists  ( select opp.assignment
from  CallResult cr join Opportunity on cr.id = opp.id 
where cr.CallStatus in ('VVOL','RVOL')  )
and  opp.listid >= 1400
group by opp.ppc

对于大多数人来说,这可能是小菜一碟,但我在这里碰到了一堵砖墙。我感激任何帮助(我也准备好对我大吼大叫)。

谢谢! 戴安

2 个答案:

答案 0 :(得分:1)

需要子查询,因为它以与第一个连接语句相同的方式连接数据。因为它是数据NOT IN子查询。我移动你的子查询的WHERE子句并像这样否定它:

DECLARE @Callback TABLE (
    ProspectRelationCode VARCHAR(1)
    ,CallbackAvail INT
    )

INSERT INTO @Callback
SELECT opp.ppc AS ProspectRelationCode
    ,sum(CASE 
            WHEN dl.Category = 'Refusal'
                THEN 1
            ELSE 0
            END) AS CallbackAvail
FROM CallResult cr
INNER JOIN Opportunity opp ON opp.id = cr.ID
INNER JOIN dbo.DispositionLookup dl ON dl.lookupkey = cr.CallStatus
WHERE   dl.Category = 'Refusal'
        AND cr.CallStatus != 'VVOL'
        AND cr.CallStatus != 'RVOL'
        AND opp.listid >= 1400
GROUP BY opp.ppc

答案 1 :(得分:0)

这有用吗?

select
    opp.ppc as ProspectRelationCode,
    sum(case when dl.Category = 'Refusal' 
        then 1 else 0
    end) as CallbackAvail

from CallResult cr
join Opportunity opp
    on opp.id = cr.ID
join dbo.DispositionLookup dl
    on dl.lookupkey = cr.CallStatus
where dl.Category = 'Refusal' and not exists  ( select Opportunity.id
from  CallResult cri join Opportunity on cri.id = opp.id 
where cri.CallStatus in ('VVOL','RVOL')  )
and  opp.listid >= 1400
group by opp.ppc

更改了子查询中的选择列表,并且为了清晰起见也更改了别名。