带有重复键的 SQL 查询

Posted

技术标签:

【中文标题】带有重复键的 SQL 查询【英文标题】:SQL Query with duplication key 【发布时间】:2020-09-17 14:19:14 【问题描述】:

我有一张这样的桌子

KEY|VIN|MORE DATA 
1  |123| BLA BLA
2  |456|
3  |678|
4  |777|
1  |888|

现在我需要查询,所以当 KEY 有重复时,例如是不同的结果,例如

结果

KEY|VIN|VIN2
1  |123|888

我该怎么做?

【问题讨论】:

到目前为止你尝试过什么?你被困在哪里了? 提示:GROUP BY. 如果有人插入行(1,357,'xyz'),预期的结果是什么? 请用数据库标记。您需要使用枢轴。 【参考方案1】:

对于您的示例数据,您可以只使用聚合:

select key, min(vin) vin, max(vin) vin2
from mytable
group by key
having count(*) > 1

如果每个 key 有两个以上的值,这可能不会完全符合您的要求(结果集中只会显示两个值)。也许您想改用条件聚合:

select 
    key, 
    max(case when rn = 1 then vin end) vin1, 
    max(case when rn = 2 then vin end) vin2, 
    max(case when rn = 3 then vin end) vin3
from (select t.*, row_number() over(partition by key order by vin) rn from mytable)
group by key
having count(*) > 1

这将处理每个 key 最多三个值 - 您可以根据需要使用更多条件 max() 表达式扩展 select 子句。

【讨论】:

以上是关于带有重复键的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

SQL多个主键的表,插入数据有重复时,查询数据的重复值?

插入带有外键的查询

一个带有两个where子句的查询中的两个sql总和[重复]

如何在带有 £ 符号的数字列上为 SQL 查询添加前缀 [重复]

sql语句查询出的两行数据除了主键其他都一样,怎么去掉重复数据

带有大小写的Oracle SQL查询垂直到水平[重复]