技术问询:如何查询数据表中被分配到多个订单的barcode
查询被分配至多个订单的条码记录
问题需求
从包含barcode(条码)和ord_no(订单号)的数据表中,筛选出所有被分配到多个不同订单的条码的完整记录。
示例数据表
| barcode | ord_no |
|---|---|
| 1233 | 1 |
| 1234 | 2 |
| 1233 | 3 |
| 1235 | 4 |
| 1236 | 5 |
| 1237 | 6 |
| 1235 | 7 |
| 1238 | 8 |
预期输出结果
| barcode | ord_no |
|---|---|
| 1233 | 1 |
| 1233 | 3 |
| 1235 | 4 |
| 1235 | 7 |
解决方案
方法一:分组筛选 + 关联查询
先通过分组找出关联多个订单的条码,再匹配原表获取完整记录:
SELECT t.barcode, t.ord_no FROM your_table t JOIN ( SELECT barcode FROM your_table GROUP BY barcode HAVING COUNT(DISTINCT ord_no) > 1 ) dup ON t.barcode = dup.barcode ORDER BY t.barcode, t.ord_no;
- 子查询负责筛选出订单数大于1的条码
- 通过
JOIN关联原表,得到这些条码的所有订单记录 COUNT(DISTINCT ord_no)确保统计的是不同订单数量,避免同一订单重复记录的干扰
方法二:窗口函数(适用于MySQL 8+、PostgreSQL、SQL Server等)
利用窗口函数直接计算每个条码的关联订单数,再筛选目标记录:
SELECT barcode, ord_no FROM ( SELECT barcode, ord_no, COUNT(DISTINCT ord_no) OVER (PARTITION BY barcode) AS order_count FROM your_table ) t WHERE order_count > 1 ORDER BY barcode, ord_no;
PARTITION BY barcode按条码分组,计算每组内的订单数量- 外层查询直接筛选出订单数大于1的记录,无需额外关联,大数据量下性能更优
注意:将代码中的
your_table替换为你的实际数据表名称。
内容的提问来源于stack exchange,提问作者Sujeet Chaurasia
相关产品推荐
相关产品推荐

