sql - 返回表中重复值的所有列名
问题描述
我想知道是否可以为 oracle sql 返回具有相同 ID 值的重复列的所有值
我的桌子设计会在下面
表 A
Name ID Order Year
------ ------ ------- ------
JOHN 1 ORD123 2017
JAKE 2 ORD122 2018
JES 2 ORD111 2017
JOHN 3 ORD323 2012
NICK 4 ORD133 2011
AMY 4 ORD222 2010
MUS 4 ORD132 2010
我希望查询的结果如下
Name ID Order Year
------ ------ ------- ------
JAKE 2 ORD122 2018
JES 2 ORD111 2017
NICK 4 ORD133 2011
AMY 4 ORD222 2010
MUS 4 ORD132 2010
解决方案
您可以使用分析函数在单个表扫描中执行此操作:
Oracle 11g R2 模式设置:
CREATE TABLE TableA ( Name, ID, "Order", Year ) AS
SELECT 'JOHN', 1, 'ORD123', 2017 FROM DUAL UNION ALL
SELECT 'JAKE', 2, 'ORD122', 2018 FROM DUAL UNION ALL
SELECT 'JES', 2, 'ORD111', 2017 FROM DUAL UNION ALL
SELECT 'JOHN', 3, 'ORD323', 2012 FROM DUAL UNION ALL
SELECT 'NICK', 4, 'ORD133', 2011 FROM DUAL UNION ALL
SELECT 'AMY', 4, 'ORD222', 2010 FROM DUAL UNION ALL
SELECT 'MUS', 4, 'ORD132', 2010 FROM DUAL;
查询 1:
SELECT Name, ID, "Order", Year
FROM (
SELECT t.*,
COUNT(*) OVER ( PARTITION BY id ) AS num_duplicates
FROM tableA t
)
WHERE num_duplicates > 1
结果:
| NAME | ID | Order | YEAR |
|------|----|--------|------|
| JAKE | 2 | ORD122 | 2018 |
| JES | 2 | ORD111 | 2017 |
| NICK | 4 | ORD133 | 2011 |
| AMY | 4 | ORD222 | 2010 |
| MUS | 4 | ORD132 | 2010 |
IN ( SELECT ... GROUP BY id HAVING COUNT(*) > 1 )
在自连接中使用或聚合将需要两次表/索引扫描。
更新
如果我有两个条件,是否也可以,也许是 id 和 year?
查询 2:只需将附加列添加到PARTITION BY
子句:
SELECT Name, ID, "Order", Year
FROM (
SELECT t.*,
COUNT(*) OVER ( PARTITION BY id, year ) AS num_duplicates
FROM tableA t
)
WHERE num_duplicates > 1
结果:
| NAME | ID | Order | YEAR |
|------|----|--------|------|
| AMY | 4 | ORD222 | 2010 |
| MUS | 4 | ORD132 | 2010 |
推荐阅读
- javascript - 如何通过过渡打开/关闭文本?
- java - 如何使用各自的模式验证整个 json 以便在 java 中集成
- java - 如何在 jboss 中修复“IJ000305:发生连接错误”
- python - 为什么我不断收到“无法找到元素”
- reactjs - 是节点 5.0.3 的反应构建
- flutter - 为什么发布应用程序不能作为调试应用程序工作?
- python - 为什么我不能在 Python 3 中反转所有迭代器?
- postgresql - 如何使用变量通过 pgx 驱动程序获取不同的表?
- java - 从 Spring Boot 中以 PDF 内容类型生成内容的外部 Rest API 提取响应字节的正确方法是什么?
- php - 尝试登录 wordpress 管理面板时突然开始收到警报