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;