繁体   English   中英

SQL DB2 与连接运算符关联或在 Merge 语句中的 On 子句无效

[英]SQL DB2 On clause associated with join operator or in a Merge statement is not valid

所以我试图运行一个查询并发现它产生了一个我不清楚的错误:

    select a.employer_id, a.customer_id, s.service, count(a.account_num) as "TOTAL_COUNT" 
        from dhs01.msa_account  a
left outer join dhs01.alt_services s
    on a.customer_id = s.customer_id
        and s.service = 'TH'
        and a.employer_id not in (select s2.employer_id from dhs01.alt_services s2 where s2.service = 'TE')   -<<<<----- THIS IS THE BAD LINE
where 
        a.ACCT_MAINT_FEE = 'E'
        AND a.STAT = 'O'
        AND a.OPEN_CONFIRM_DATE < (CURRENT_DATE - (DAY(CURRENT_DATE)-1) DAYS) ---first of the current 

    group by a.employer_id, a.customer_id, s.service;

查询非常接近工作,但由于某种原因,子选择查询抛出错误(如果我删除它,我得到的结果基本上是正确的,除了不排除我想排除的那些结果)。 我通常在 db2 中看到 on 子句中的子选择起作用,并且实际上有一些看起来相似的例子。

尝试:

from dhs01.msa_account  a
left join table
(
select s.*
from dhs01.alt_services s 
where s.customer_id = a.customer_id and s.service = 'TH'
and not exists
(
select 1
from dhs01.alt_services s2 
where s2.service = 'TE' and s2.employer_id = a.employer_id
)
) s on 1=1

代替:

from dhs01.msa_account  a
left outer join dhs01.alt_services s
    on a.customer_id = s.customer_id
        and s.service = 'TH'
        and a.employer_id not in (select s2.employer_id from dhs01.alt_services s2 where s2.service = 'TE')   -<<<<----- THIS IS THE BAD LINE

您的查询似乎完全正确,但您仍然可以使用以下查询 -

SELECT          a.employer_id, 
                a.customer_id, 
                s.service, 
                COUNT(a.account_num) AS "TOTAL_COUNT" 
FROM            dhs01.msa_account a 
LEFT OUTER JOIN dhs01.alt_services s 
ON              a.customer_id = s.customer_id 
AND             s.service = 'TH' 
WHERE           a.acct_maint_fee = 'E' 
AND             a.stat = 'O' 
AND             a.open_confirm_date < (CURRENT_DATE - (DAY(CURRENT_DATE)-1) DAYS) --first of the current 
AND NOT EXISTS  (SELECT NULL
                 FROM   dhs01.alt_services s2 
                 WHERE  s2.service = 'TE'
                 AND    a.employer_id = s2.employer_id)
GROUP BY        a.employer_id, 
                a.customer_id, 
                s.service;

如果你想在On Clause中过滤,你可以尝试下面的查询:

select a.employer_id, a.customer_id, s.service, count(a.account_num) as "TOTAL_COUNT" 
    from dhs01.msa_account  a
left outer join dhs01.alt_services s
on a.customer_id = s.customer_id
    and s.service = 'TH'
    and a.employer_id <> (select distinct s2.employer_id from dhs01.alt_services s2 where s2.service = 'TE' and a.employer_id=s2.employer_id)   
where 
    a.ACCT_MAINT_FEE = 'E'
    AND a.STAT = 'O'
    AND a.OPEN_CONFIRM_DATE < (CURRENT_DATE - (DAY(CURRENT_DATE)-1) DAYS) ---first of the current 

group by a.employer_id, a.customer_id, s.service;

如果您想排除所有具有service = 'TE'的 employer_id 以减少执行时间,那么您应该尝试以下查询:-

select a.employer_id, a.customer_id, s.service, count(a.account_num) as "TOTAL_COUNT" 
    from dhs01.msa_account  a
left outer join dhs01.alt_services s
on a.customer_id = s.customer_id
    and s.service = 'TH'   
where 
    a.ACCT_MAINT_FEE = 'E'
    AND a.STAT = 'O'
    AND a.OPEN_CONFIRM_DATE < (CURRENT_DATE - (DAY(CURRENT_DATE)-1) DAYS) ---first of the current 
AND not exists(select 1 from dhs01.alt_services s2 where s2.service = 'TE' and a.employer_id=s2.employer_id)

group by a.employer_id, a.customer_id, s.service;

暂无
暂无

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

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