选择3列,不重复

时间:2017-03-12 20:43:25

标签: sql sql-server

我在SQL Server中有一个包含3列的表:

Article_Id   LanguageCode     Text
---------------------------------------------
    1           FRA           Sac en papier
    1           GER           Tragtasche
    2           GER           Pizzapapier
    3           FRA           Couteau 

查询的结果必须是:

Article_Id    LanguageCode    Text
-------------------------------------------
    1           FRA           Sac en papier
    2           GER           Pizzapapier
    3           FRA           Couteau 

每个Article_Id只有一次LanguageCode FRARouter,如果不存在则为GER

我尝试了不同但却没有结果。

2 个答案:

答案 0 :(得分:0)

这是优先级查询。只有两种语言,我认为最简单的方法是:

select a.*
from atable a
where a.LanguageCode = 'FRA'
union all
select a.*
from atable a2
where a.LanguageCode = 'GER' and
      not exists (select 1
                  from atable a2
                  where a2.article_id = a.article_id and a2.Language_code = 'FRA'
                 );

如果你有两种以上的语言,上面的内容会很麻烦。因此,请使用row_number()

select a.*
from (select a.*,
             row_number() over (partition by article_id
                                order by charindex(languagecode, 'FRA,GER')
      from atable a
     ) a
where seqnum = 1;

charindex()是一个捷径,因此您不必撰写长case语句。如上所述,如果我们假设所有语言代码具有相同的长度,则应该没问题。

答案 1 :(得分:0)

  

我试着与众不同,但结果并不合适。

DISTINCT删除重复的。您想删除重复的Article_Id并显示"首先"每一行。所以从那里开始:

select Article_Id, min(LanguageCode) as LanguageCode
from T
group by Article_Id

要获取表 A 中表格 B 中的行,请使用EXISTS

select * from T as main
where exists (
    select 1 from T
    where Article_Id = main. Article_Id
    group by Article_Id
    having min(LanguageCode) = main.LanguageCode
)

通过将表连接到第一个查询,您也可以通过连接到达那里,但是对相关子查询感到满意可以节省您的工作。