首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以下查询的Not In子句的等效连接子句

以下查询的Not In子句的等效连接子句
EN

Stack Overflow用户
提问于 2018-11-19 00:19:28
回答 3查看 75关注 0票数 0

我有以下问题

代码语言:javascript
复制
select 
    'Un-contacted Cases'as Header, COUNT(a.Id) as Nos,
    ISNULL(SUM(convert(decimal(18, 2), (isnull(PRINCIPAL_OD, 0)))), 0) as Amt
from 
    LoanAccounts a 
where
    a.Id not in (select b.AccountId  
                 from Feedback b 
                 where OutcomeCurrentAction in ('ptp','Contact new PTP','Contact- No new PTP','Contact- No PTP','Met-No-PTP','New PTP','Payment/Direct Deposit') 
                )

这将返回以下输出:

代码语言:javascript
复制
Header              Nos      Amt
----------------------------------------
Un-contacted Cases  1149    131942525.00

但是,在尝试使用left join编写相同的查询时,我得到了不同的输出

代码语言:javascript
复制
select  
    'Un-contacted Cases' as Header, COUNT(a.Id) as Nos,
    ISNULL(SUM(convert(decimal(18, 2), (isnull(PRINCIPAL_OD, 0)))), 0) as Amt
from 
    LoanAccounts a 
left join 
    Feedback b on b.AccountId = a.Id 
where 
    OutcomeCurrentAction in ('ptp','Contact new PTP','Contact- No new PTP','Contact- No PTP','Met-No-PTP','New PTP','Payment/Direct Deposit') 

这将返回以下输出:

代码语言:javascript
复制
Header              Nos      Amt
---------------------------------------
Un-contacted Cases  51      6026486.00

对于上述不在-中的连接,什么可以是等价的连接?

EN

回答 3

Stack Overflow用户

发布于 2018-11-19 00:21:24

它看起来是这样的:

代码语言:javascript
复制
select 'Un-contacted Cases'as Header, COUNT(a.Id) as Nos,
       COALESCE(SUM(convert(decimal(18, 2), PRINCIPAL_OD)), 0) as Amt
from LoanAccounts a left join
     Feedback b
     on b.AccountId = a.Id and 
        b.OutcomeCurrentAction 
     in ('ptp','Contact new PTP','Contact- No new PTP','Contact- No PTP','Met-No-PTP','New PTP','Payment/Direct Deposit') 
where b.AccountId is null;

我还修好了你的SUM()。你的版本比必要的复杂。实际上我觉得你真的想:

代码语言:javascript
复制
       convert(decimal(18, 2) coalesce(sum(PRINCIPAL_OD), 0) as Amt

在对小数进行算术时,最好在算术之后进行转换--如果这是您真正想要的数据类型。

票数 1
EN

Stack Overflow用户

发布于 2018-11-19 00:22:02

你可以像下面这样尝试

代码语言:javascript
复制
select 'Un-contacted Cases'as Header, COUNT(a.Id) as Nos,ISNULL(SUM(convert(decimal(18,2),(isnull(PRINCIPAL_OD,0)))),0) as Amt
from LoanAccounts a
left join
(
select b.AccountId  from Feedback b 
    where   OutcomeCurrentAction in ('ptp','Contact new PTP','Contact- No new PTP','Contact- No PTP','Met-No-PTP','New PTP','Payment/Direct Deposit') 
) a1 on a.Id =a1.AccountId  
  where a1.AccountId  is null
票数 1
EN

Stack Overflow用户

发布于 2018-11-19 21:15:56

如果您正在对表b执行左连接,则不能将表b中的行上的过滤器放入where子句中(除非它要查找空值)。where子句实际上将左连接转换为内连接,因为表b中不存在的行将始终具有空字段值。

因此,您需要将where子句内容放入左连接条件中。如下所示:

代码语言:javascript
复制
select  
'Un-contacted Cases' as Header, COUNT(a.Id) as Nos,
ISNULL(SUM(convert(decimal(18, 2), (isnull(PRINCIPAL_OD, 0)))), 0) as Amt
from 
LoanAccounts a 
left join 
Feedback b on b.AccountId = a.Id 
and
b.OutcomeCurrentAction in ('ptp','Contact new PTP','Contact- No new PTP','Contact- No PTP','Met-No-PTP','New PTP','Payment/Direct Deposit')
where b.AccountId is null

这基本上与戈登的答案相同,但只是为了解释原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53362972

复制
相关文章

相似问题

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