查看以基于SQL中的另一个表显示/隐藏行值

时间:2014-11-07 14:51:16

标签: sql oracle

我有一张包含客户联系数据的表格,例如:

cust_id tel_no email
cust1   234238 a@a.com
cust2   423443 a@ab.com
cust3   234238 d@a.com

我有一张表格,显示哪些渠道不会用于特定客户(让我们称之为退出)

cust_id channel
cust1   tel_no
cust2   tel_no
cust2   email
cust3   email

我想在SQL中创建一个视图,它会根据optout表中的客户/渠道组合隐藏第一个表中的联系人数据,以便结果如下所示:

cust_id tel_no email
cust1          a@a.com
cust2   
cust3   234238 

最好的方法是什么?我在考虑类似的事情     case when cust1 in (select cust_id from optout where channel = 'tel_no') 作为每个领域的检查,但如果有500,000个客户,它可能是有用的。 感谢。

1 个答案:

答案 0 :(得分:1)

尝试此查询:

SELECT c.cust_id,
    nvl2( q.tel_no, null, c.tel_no ) tel_no,
    nvl2( q.email, null, c.email ) email
FROM contact_data c
LEFT JOIN (
  SELECT cust_id,
      min(case channel when 'tel_no' then 1 end) tel_no,
      min(case channel when 'email' then 1 end) email
  FROM opt
  GROUP BY cust_id 
) q
ON c.cust_id = q.cust_id
ORDER BY c.cust_id

演示:http://sqlfiddle.com/#!4/7e890c/8