You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL JOIN查询返回重复行,求单客户单行输出的解决方法

解决JOIN后重复行问题:单客户单行展示需求

方案1:展示每个客户的订单总数

使用GROUP BY按客户分组,配合COUNT()聚合函数统计订单数量,确保每个客户仅返回一行记录。若需包含无订单的客户,可将JOIN替换为LEFT JOIN:

-- 仅展示有订单的客户
SELECT 
  c.CustomerName,
  COUNT(o.OrderID) AS OrderCount
FROM Customers c
JOIN Orders o ON c.CustomerID = o.CustomerID
GROUP BY c.CustomerID, c.CustomerName;

-- 包含无订单的客户(订单数显示为0)
SELECT 
  c.CustomerName,
  COUNT(o.OrderID) AS OrderCount
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
GROUP BY c.CustomerID, c.CustomerName;

方案2:展示每个客户的最新订单

提供两种常用实现方式:

方法A:窗口函数(推荐,适用于MySQL 8+、PostgreSQL、SQL Server等支持窗口函数的数据库)

用ROW_NUMBER()窗口函数给每个客户的订单按OrderID降序编号,取编号为1的行(即最新订单):

SELECT CustomerName, OrderID
FROM (
  SELECT 
    c.CustomerName,
    o.OrderID,
    ROW_NUMBER() OVER (PARTITION BY c.CustomerID ORDER BY o.OrderID DESC) AS rn
  FROM Customers c
  JOIN Orders o ON c.CustomerID = o.CustomerID
) AS sub
WHERE rn = 1;

方法B:子查询关联

先查询每个客户的最大OrderID(即最新订单),再通过JOIN关联回原表获取对应信息:

SELECT 
  c.CustomerName,
  o.OrderID
FROM Customers c
JOIN Orders o ON c.CustomerID = o.CustomerID
JOIN (
  SELECT CustomerID, MAX(OrderID) AS LatestOrderID
  FROM Orders
  GROUP BY CustomerID
) AS latest ON o.OrderID = latest.LatestOrderID;

注:如果需要包含无订单的客户,可将JOIN替换为LEFT JOIN,此时无订单客户的OrderID会显示为NULL。

内容的提问来源于stack exchange,提问作者Gaurav Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:24:54