【发布时间】:2014-03-03 21:49:24
【问题描述】:
我知道有很多类似的问题。实际上我使用了this,它可以工作,但我不知道如何包含第二个表中不匹配的记录。
我在 MS SQL Server 上使用示例 Northwind db。
使用这个查询:
SELECT Customers.CustomerID, Customers.CompanyName, Orders.OrderID, Orders.OrderDate
FROM Customers
LEFT OUTER JOIN Orders
ON Customers.CustomerID=Orders.CustomerID
INNER JOIN
(
SELECT CustomerID, MAX(OrderDate) maxDate
FROM Orders
GROUP BY CustomerID
) b ON Orders.CustomerID = b.CustomerID AND
Orders.OrderDate = b.maxDate
ORDER BY Orders.OrderDate
我得到正确的结果,但缺少不匹配的记录。
如果我使用 LEFT OUTER JOIN 代替 INNER JOIN:
SELECT Customers.CustomerID, Customers.CompanyName, Orders.OrderID, Orders.OrderDate
FROM Customers
LEFT OUTER JOIN Orders
ON Customers.CustomerID=Orders.CustomerID
LEFT OUTER JOIN
(
SELECT CustomerID, MAX(OrderDate) maxDate
FROM Orders
GROUP BY CustomerID
) b ON Orders.CustomerID = b.CustomerID AND
Orders.OrderDate = b.maxDate
ORDER BY Orders.OrderDate
我丢失了记录,但在这种情况下我重复了客户名称。
我想要:获取只有他最后一个订单的客户列表,如果他没有订单,他的名字无论如何都应该出现。
【问题讨论】:
-
您确定不会在内部联接中获得重复的客户名称吗?
-
不,没有,只需使用 ORDER BY Customers.CustomerID 运行即可检查。
-
看来我在这里找到了解决方案:stackoverflow.com/questions/11764413/…
-
。 .我不明白为什么左外连接会导致重复的客户名称。
left outer join是一种解决方案,尽管窗口函数是更好的解决方案。
标签: sql sql-server join