内联SQL从结果中删除重复项

时间:2018-11-27 16:21:08

标签: sql sql-server inline

我有一张桌子,上面有英语(en)和法语(fr)的译文。当en不能使用fr数据时,我试图回退到ctxt.Locale = 'fr' or ctxt.Locale = 'en'

但是,当我拥有fr数据查询时,会同时检索fren数据,并且两个数据集都显示在UI中。

我的要求是仅在有数据时检索fr,而在无en数据可用时退回到fr。最好的方法是什么?

我可以使用IIF命令吗?

编辑

这是完整的SQL命令

SELECT
    ctxt.ID,
    ctxt.Locale,
    c.ID
FROM
    Category_Table c
INNER JOIN 
    Category_Table_Text ON c.ID = ctxt.ID
                        AND (ctxt.Locale = 'fr' OR ctxt.Locale = 'en')
WHERE 
    c.CatergoryID = 1

编辑2

ctxt table

2 个答案:

答案 0 :(得分:1)

您可以选择两种语言环境,根据您的规则添加人为的优先级,并且只能选择其中一种(最高的语言环境):

select top 1 id, locale
from (
  select 1 as priority, id, locale from category_table
    where CatergoryID = 1 and locale = 'fr'
  union all
  select 2 as priority, id, locale from category_table
    where CatergoryID = 1 and locale = 'en'
) x
order by priority

或者...您可以写:

select top 1 id, locale
from (
  select 
    case when locale = 'fr' then 1 else 2 end as priority, id, locale 
    from category_table
    where CatergoryID = 1 and (locale = 'fr' or locale = 'en')
) x
order by priority

答案 1 :(得分:0)

由于只有2个,因此您可以双重加入上下文。并合并空的法语上下文值。

例如

SELECT 
c.ID, 
COALESCE(fr.Locale, en.Locale) AS Locale
FROM Category_Table c
LEFT JOIN Category_Table_Text fr ON fr.ID = c.ID AND fr.Locale = 'fr'
LEFT JOIN Category_Table_Text en ON en.ID = c.ID AND en.Locale = 'en'
WHERE c.CategoryID = 1

但是您也可以通过默认为'en'来简化此操作。

SELECT 
c.ID, 
COALESCE(ctxt.Locale, 'en') AS Locale
FROM Category_Table c
LEFT JOIN Category_Table_Text ctxt ON ctxt.ID = c.ID AND ctxt.Locale = 'fr'
WHERE c.CategoryID = 1

db <>提琴here