一个相同列的SQL联合

时间:2017-09-12 07:52:29

标签: sql-server union

我有一个SQL表来翻译我的网站,如下所示:

翻译

  • id:xxx.xxx.xxxx.xxxx
  • 标签:lbl_name
  • 翻译:姓名
  • 语言:英语

我试图为用户提供自定义翻译,用户可以在其中设置一个或多个标签 所以他会有类似的东西:

  • id:xxx.xxx.xxxx.xxxx
  • 标签:lbl_name
  • 翻译:n4m3
  • 语言:EnglishCustom

我想从TRANSLATE中选择全部,其中Languague =" English"

然后从TRANSLATE中选择全部,其中Languague =" EnglishCustom"

仅为姓名专栏做联盟。因此,如果我们有一个相同的名称(这里:lbl_name),我会优先使用EnglishCustom来获得" N4M3"而不是" name"。

我只想了解我们如何做一个:如果我们有2个相同的Label,那么用户在这个标签上添加了一个trad,所以在EnglishCustom上获取Translate而不是在英语上,使用SQL请求

你能帮帮我吗?谢谢

3 个答案:

答案 0 :(得分:2)

试试这个:

select id,Label,Translate,Languague
from
(select id,Label,Translate,Languague,ROW_NUMBER() over (partition by id,label order by languague desc) rn
from TRANSLATE
where Languague in('English','EnglishCustom')) a
where a.rn =1

<强>输出:

id  Label       Translate   Languague
1   lbl_name    n4m3        EnglishCustom      

答案 1 :(得分:0)

SELECT TOP 1 * FROM 
(
SELECT * , 1 as Seq 
FROM TRANSLATE where Languague = "EnglishCustom"
UNION ALL 
SELECT * ,2 as Seq 
FROM TRANSLATE where Languague = "English"
) AS myTab
ORDER BY Seq

答案 2 :(得分:0)

如果您的查询准备就绪,只需要返回正确的值,您可能需要查看coalesce()

让我们假设这个查询(仅针对eyplain,可能不起作用):

SELECT COALESCE(t2.TRANSLATE,t1.TRANSLATE)
FROM TRANSLATE t1
  LEFT JOIN TRANSLATE t2
         ON t1.label = t2.label
        AND t2.Languague = CONCAT (t1.Languague,'Custom')
WHERE t1.Languague = 'English'

COALESCE将返回第一个非空值。 如果LEFT JOIN未加入任何自定义名称,则将返回默认值。

在这个Pastebin中,我使用MySQL表进行了快速测试,该表也适用于你。