sql - 从该表中选择正确数据的有效方法是什么?
问题描述
这是我的桌子
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
解决方案
我会在这里使用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);
演示
这里的逻辑是为每个键保留具有“最高”语言值的记录。对于同时具有en
和vi
记录的键,它会选择后者的记录,否则默认选择前者。
推荐阅读
- python - 有时,对象是不可迭代的
- java - @ManyToOne and @OneToOne on the same entity
- bash - 如何使用bash在.txt文件中用零替换列中的值
- spring - 在 restfull api 参数或正文中约会?
- bash - Bash 脚本,从文件中获取值并按顺序将它们添加到另一个文件中
- mysql - Mysql 8.0:如何更改过程定义器
- php - 如何将多张图片上传到 PHP Mysql
- r - 相关性下降 NAs R
- kubernetes - 使用 Kubernetes Ingress 在 GCP 中使用 IP(无主机/域名)进行路径路由
- php - 如何在laravel上传的excel中使用时间格式的excel单元格?