如何筛选同一目录索引下名称不同的重复商品数据
问题描述
现有商品数据表ARTYKUL的结构及数据如下:
| INDEKS_KATALOGOWy | ID_MAGAZYNU | Nazwa |
|---|---|---|
| Opa000001 | 1 | Węgiel |
| Opa000001 | 6 | Węgiel |
| Opa000001 | 7 | Węgiel |
| Opa000002 | 1 | Węgiel brunatny |
| Opa000002 | 6 | Węgiel brunatny |
| Opa000002 | 7 | Węgiel brunatny |
| PRO000001 | 1 | Pasta 10 ml |
| PRO000001 | 6 | Pasta 10 ml |
| PRO000001 | 7 | Pasta 10 ml |
| PRO000001 | 8 | PASTA 10 ml |
| ROL000001 | 1 | Artykuły rolnicze |
| ROL000001 | 6 | Artykuły rolnicze |
| ROL000001 | 7 | Artykuły rolnicze |
当前使用的SQL查询语句为:
select indeks_katalogowy, ID_MAGAZYNU, Nazwa from artykul where indeks_katalogowy in (Select INDEKS_KATALOGOWY from ARTYKUL Group by INDEKS_KATALOGOWY, NAZWA having count(*) >1)
需要修改查询,仅显示同一INDEKS_KATALOGOWY下存在不同Nazwa的商品记录(例如PRO000001,因"Pasta 10 ml"与"PASTA 10 ml"视为不同名称),期望输出结果如下:
| INDEKS_KATALOGOWy | ID_MAGAZYNU | Nazwa |
|---|---|---|
| PRO000001 | 1 | Pasta 10 ml |
| PRO000001 | 6 | Pasta 10 ml |
| PRO000001 | 7 | Pasta 10 ml |
| PRO000001 | 8 | PASTA 10 ml |
解决方案
原SQL的问题在于子查询按INDEKS_KATALOGOWY和NAZWA分组后统计重复名称的记录,筛选出的是同一目录索引下同一名称出现多次的商品,不符合需求。
正确思路是先找出同一INDEKS_KATALOGOWY下对应不同Nazwa的目录索引,再用这些索引匹配原表的所有记录。
修改后的SQL语句如下:
SELECT indeks_katalogowy, ID_MAGAZYNU, Nazwa FROM artykul WHERE indeks_katalogowy IN ( SELECT INDEKS_KATALOGOWY FROM ARTYKUL GROUP BY INDEKS_KATALOGOWY HAVING COUNT(DISTINCT Nazwa) > 1 )
逻辑说明
- 子查询部分:按
INDEKS_KATALOGOWY分组,通过COUNT(DISTINCT Nazwa)统计每个目录索引下不同名称的数量,筛选出数量大于1的目录索引(即存在不同名称的商品)。 - 外层查询:用筛选出的目录索引,获取原表中对应的所有商品记录,得到目标结果。
内容的提问来源于stack exchange,提问作者Tomasz Maciążek
相关产品推荐
相关产品推荐

