如何筛选WorkOrder、EngOrder、PartNo重复但InstPosition不同的行?
解决筛选WorkOrder/EngOrder/PartNo相同但InstPosition不同行的问题
原始数据表格
| Aircraft | WorkOrder | EngOrder | Description | PartNo | InstPosition |
|---|---|---|---|---|---|
| KHB | 21 | 45 | engine 1 | pw123 | E1 |
| KHB | 21 | 45 | engine 4 | pw123 | E2 |
| KHB | 22 | 45 | engine 2 | pw122 | E1 |
| KBG | 31 | 55 | rotor engine | v123 | E2 |
| KBG | 36 | 51 | engine 9 | v156 | E1 |
| KBG | 31 | 55 | engine comp | v123 | E1 |
预期结果
| Aircraft | WorkOrder | EngOrder | Description | PartNo | InstPosition |
|---|---|---|---|---|---|
| KHB | 21 | 45 | engine 1 | pw123 | E1 |
| KHB | 21 | 45 | engine 4 | pw123 | E2 |
| KBG | 31 | 55 | rotor engine | v123 | E2 |
| KBG | 31 | 55 | engine comp | v123 | E1 |
你的SQL问题所在
你写的自连接语句存在语法错误:INNER JOIN b 未指定b表的来源,需写成 INNER JOIN 你的表名 b;即便修正语法,原语句还会返回重复行(同一行会被双向匹配),导致结果不符合预期。
正确的解决方案
方案1:修正自连接并去重
SELECT DISTINCT a.* FROM 你的表名 a INNER JOIN 你的表名 b ON a.WorkOrder = b.WorkOrder AND a.EngOrder = b.EngOrder AND a.PartNo = b.PartNo AND a.InstPosition != b.InstPosition
- 用
DISTINCT避免重复返回同一行 - 将
你的表名替换为实际表名
方案2:分组筛选目标组合后关联查询
先筛选出存在多个不同InstPosition的WorkOrder/EngOrder/PartNo组合,再关联原始表获取完整数据,逻辑更清晰且性能更优:
SELECT t.* FROM 你的表名 t INNER JOIN ( SELECT WorkOrder, EngOrder, PartNo FROM 你的表名 GROUP BY WorkOrder, EngOrder, PartNo HAVING COUNT(DISTINCT InstPosition) > 1 ) g ON t.WorkOrder = g.WorkOrder AND t.EngOrder = g.EngOrder AND t.PartNo = g.PartNo
内容的提问来源于stack exchange,提问作者Саят Оразов
相关产品推荐
相关产品推荐

