在我们的系统中,每个客户都有一个称呼(0),有些还有另外一个称呼(22)。我需要做的是让那些没有22的人默认为0。我试图用一个案例陈述来完成这个:
select distinct a.customer_no,
case when b.sal_code = '22' then '22'
when b.sal_code <> '22' then '0'
else '0'
end as salutation_no
from t_customer a
join t_sal b
on a.customer_no = b.customer_no
where a.customer_no in (1734379, 120706)
然而,对于那些不支持22和0的客户而言,我得到的不是22,而是所有客户都得到0,而对于那些拥有该客户的人则得到22;
customer_no salutation_no
120706 0
120706 22
1734379 0
答案 0 :(得分:3)
你得到双重记录,因为有些客户有2个称呼,加入的结果是那些双重记录。
您可以使用此查询获取一条记录。它使用max
函数,因为您希望22覆盖0。
select a.customer_no,
max(sal_code) as salutation_no
from t_customer a
join t_sal b
on a.customer_no = b.customer_no
where a.customer_no in (1734379, 120706)
group by a.customer_no
答案 1 :(得分:1)
仅在类型为'22'
时加入称呼,其他所有人现在null
都有sal_code
。使用coalesce
将null
默认为'0'
。
select C.customer_no
, coalesce(S.sal_code, '0') as salutation_no
from t_customer C
left join t_sal S
on S.customer_no = C.customer_no
and S.sal_code = '22'
where S.customer_no in (1734379, 120706)
distinct
,则不清楚数据模型。t_customer
行,t_sal
中没有可在您的查询中过滤掉的行。在不知道数据的情况下,我并非100%确定这是一个合适的解决方案。 答案 2 :(得分:0)
避免重复的另一种方法是使用union all
:
select s.customer_no, '22' as sal_code
from t_sal s
where s.sal_code = '22'
union all
select c.customer_no, '0'
from t_customer c
where not exists (select 1 from t_sal s where s.customer_no = c.customer_no and s.sal_code = '22');
这应该比使用group by
或select distinct
的任何查询都快。