我在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
FRA
为Router
,如果不存在则为GER
我尝试了不同但却没有结果。
答案 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
)
通过将表连接到第一个查询,您也可以通过连接到达那里,但是对相关子查询感到满意可以节省您的工作。