SQL简化合并查询

SQL简化合并查询,sql,coalesce,Sql,Coalesce,我创建了以下查询: select k.vname, k.nname, coalesce( to_char(( select a1.ablaufdat from kunde k1 natural join abonnement a1 where k.vname = k1.vname and k.nname = k1.nname and a1.ablaufdat < to_date('01-01-2015', 'DD-MM-YYYY') )) , '

我创建了以下查询:

select k.vname, k.nname, coalesce(
  to_char((
    select a1.ablaufdat
    from kunde k1
    natural join abonnement a1
    where k.vname = k1.vname and k.nname = k1.nname
    and a1.ablaufdat < to_date('01-01-2015', 'DD-MM-YYYY')
))
, '-')
from kunde k
left outer join abonnement a on k.knr = a.knr 
order by k.vname asc, k.nname asc;
它向我展示了所有在2015年之前到期的客户,以及相应的日期,或者-如果没有相应的日期,这是预期的结果

然而,在我看来,这个查询太复杂了,我找不到更简单的方法。如果你能帮我简化一下,我将不胜感激。
非常感谢。

你说每个昆德只能有一个住所。所以只需外部连接,看看是否有记录:

select k.knr, k.vname, k.nname,
  coalesce(to_char(a.ablaufdat), '-' ) as ablaufdatum
from kunde k 
left outer join abonnement a on a.knr = k.knr and a.ablaufdat < to_date('01-01-2015', 'DD-MM-YYYY')
order by k.vname asc, k.nname asc;

如果他们在2015年之前有多个订阅结束,该如何工作?这种情况是不可能的。每个客户只能进行一次订阅。如果只能进行一次订阅,为什么不将日期条件添加到现有的左侧外部联接,并使用a.ablaufdat而不是子选择?我现在收到以下错误:ORA-00932:不一致的数据类型:预期日期已完成。抱歉,我将编辑答案。当然,你还需要继续。