首页 > 解决方案 > 从该表中选择正确数据的有效方法是什么?

问题描述

这是我的桌子

ID  Key     Value   Lang 
1   key1    text1   en
2   key2    text2   en
3   key3    text3   en
4   key1    chu1    vi
5   key2    chu2    vi

选择“vi”语言时,将从“en”语言中选择缺少的键基本上结果应该是

4   key1    chu1    vi
5   key2    chu2    vi
3   key3    text3   en

有没有一种有效的方法可以在没有像这样复杂的查询的情况下获得结果?

WITH cte_data
AS (
    SELECT ID
        ,Key
        ,Value
        ,Lang
    FROM tblSysText
    WHERE Lang = 'vi'
    )
SELECT ID
    ,Key
    ,Value
    ,Lang
FROM cte_data

UNION

SELECT ID
    ,Key
    ,Value
    ,Lang
FROM tblSysText
WHERE Lang = 'en'
    AND Key NOT IN (
        SELECT Key
        FROM cte_data
        )

谢谢。


更新数据集 这里和真实数据差不多

我想要的是选择特定语言的所有键和值。然后从“en”语言中选择缺少的键和值

ID  Key     Value   Lang 
1   key1    text1   en
2   key2    text2   en
3   key3    text3   en
4   key1    chu1    vi
5   key2    chu2    vi
6   key4    chu4    vi
7   key4    text4   en
8   key5    text5   en
9   key5    s5      ye
10  key6    s6      ZW

这是选择“vi”语言时的预期输出

ID  Key     Value   Lang
4   key1    chu1    vi
5   key2    chu2    vi
6   key4    chu4    vi
3   key3    text3   en
8   key5    text5   en

标签: sqlsql-server

解决方案


我会在这里使用ROW_NUMBER一个TOP 1 WITH TIES技巧:

SELECT TOP 1 WITH TIES ID, [Key], Value, Lang
FROM tblSysText
ORDER BY ROW_NUMBER() OVER (PARTITION BY [Key] ORDER BY Lang DESC);

下面演示链接的屏幕截图

演示

这里的逻辑是为每个键保留具有“最高”语言值的记录。对于同时具有envi记录的键,它会选择后者的记录,否则默认选择前者。


推荐阅读