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
相关产品推荐
相关产品推荐

