SQL左连接-在一个条件下连接,默认为另一个条件

SQL左连接-在一个条件下连接,默认为另一个条件,sql,oracle,Sql,Oracle,我正在两个表之间进行连接: SELECT * FROM Thing thing LEFT OUTER JOIN ThingDetails details ON (a.id = details.thing_id AND details.thing_language = 'Spanish') 这将基本上为我提供表'Thing'中的所有条目以及西班牙语的详细信息——如果没有西班牙语的详细信息,它将为我提供空值 我想做的是,如果ThingDetails中没有西班牙语的条目,即

我正在两个表之间进行连接:

SELECT * FROM Thing thing
    LEFT OUTER JOIN ThingDetails details 
        ON (a.id = details.thing_id AND details.thing_language = 'Spanish')
这将基本上为我提供表'Thing'中的所有条目以及西班牙语的详细信息——如果没有西班牙语的详细信息,它将为我提供空值

我想做的是,如果ThingDetails中没有西班牙语的条目,即如果
ON(a.id=details.Thing\u id AND details.Thing\u language='Spanish')
失败,那么我要做的就是“回退”到英语中


有没有一种方法可以让我轻松做到这一点?基本上知道左联接的右侧是否为null?

您可以两次联接到表。一次用于所需语言,一次用于默认语言。然后在选择中使用
COALESCE()
,执行默认设置:

SELECT thing.*, COALESCE(details_spanish.some_field, details_default.some_field) as some_field 
FROM Thing thing
    LEFT OUTER JOIN ThingDetails details_spanish
        ON (a.id = details.thing_id AND details.thing_language = 'Spanish')
    LEFT OUTER JOIN ThingDetails details_default 
        ON (a.id = details.thing_id AND details.thing_language = 'English')

使用两个
left join
s和'coalesce()

左连接将数据汇集在一起。
COALESCE()
选择您关心的列的适当值。如果您关心的列更多,请添加更多
COALESCE()

编辑:

如果不想列出列,可以执行以下操作:

select t.*, td.*
from Thing t left joi
     (select td.*,
             row_number() over (partition by thing_id
                                order by case when td.thing_language = 'Spanish' then 1 else 2 end
                               ) as seqnum
      from ThingDetails td
      where thing_language in ('Spanish', 'English')
     ) td
where seqnum = 1;

所以,如果有一个“西班牙语”记录,你想获取它。如果没有,你会满足于“英语”记录?@Error\u 2646。有没有一种简单的方法来合并ThingDetails中的所有列?@Harry。唉,没有。在Oracle12+中,您可以使用横向联接来简化查询。
select t.*, td.*
from Thing t left joi
     (select td.*,
             row_number() over (partition by thing_id
                                order by case when td.thing_language = 'Spanish' then 1 else 2 end
                               ) as seqnum
      from ThingDetails td
      where thing_language in ('Spanish', 'English')
     ) td
where seqnum = 1;