Sql 左联接中的最新记录
假设我在SqlServer中有以下3个表:Sql 左联接中的最新记录,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,假设我在SqlServer中有以下3个表: Customer (CustomerID, FirstName, LastName) Address (AddressID, CustomerID, Line1, City, State) Product (ProductID, CustomerID, Description) 一个客户可以有多个交货地址和多个产品 我想做的是列出每个州的客户数量,该州由最近的地址记录确定。例如“每个州最近收到一个产品的客户有多少?”。因此,我对客户以前的地址记录不感
Customer (CustomerID, FirstName, LastName)
Address (AddressID, CustomerID, Line1, City, State)
Product (ProductID, CustomerID, Description)
一个客户可以有多个交货地址和多个产品
我想做的是列出每个州的客户数量,该州由最近的地址记录确定。例如“每个州最近收到一个产品的客户有多少?”。因此,我对客户以前的地址记录不感兴趣,只对最近的地址记录(由AddressID确定)感兴趣
我通常会这样做:
SELECT a.State, count(c.CustomerID)
FROM Product p
INNER JOIN Customer c ON c.CustomerID = p.CustomerID
LEFT JOIN Address a ON a.CustomerID = c.CustomerID
WHERE p.ProductID = 101
GROUP BY a.State
但是,由于一个客户可能有多个地址,该客户是否仅在最新地址记录的状态下计算
另外,以上只是一个简单的示例场景,用于解释我试图实现的连接,并不反映实际的系统设计。您也可以尝试(假设我正确记住了SQLServer语法):
试试这个:
SELECT a.State, count(c.CustomerID)
FROM Product p
INNER JOIN Customer c ON c.CustomerID = p.CustomerID
LEFT JOIN Address a ON a.CustomerID = c.CustomerID
AND a.AddressID =
(
SELECT MAX(AddressID)
FROM Address z
WHERE z.CustomerID = a.CustomerID
)
WHERE p.ProductID = 101
GROUP BY a.State
如果没有Orders和OrderDetails表,我看不出如何做到这一点。Orders表将包括CustomerID ShippingDate和ShippToAddressID,OrderDetails将具有OrderID和ProductID。然后,您将需要一个嵌套查询来确定最近的订单(因此也是最近的地址),将其与订单详细信息结合起来以获得订购的产品,然后筛选您关心的产品。您是正确的,但所描述的场景纯粹是一个示例,试图简单地解释我想要实现的目标。我已经更新了我原来的问题,用一个附言来解释这一点。太好了!现在,为什么我没有想到这个!这很整洁。谢谢你,太好了。你帮了我很多。感谢对oracle不起作用:
ora-01799列不能外部联接到子查询
SELECT state, count(customer_id)
FROM (
SELECT
p.customer_id
, (SELECT TOP 1 State FROM Address WHERE Address.CustomerID = p.CustomerID ORDER BY Address.ID DESC) state
FROM Product p
WHERE p.ProductID = 101)
GROUP BY state
SELECT a.State, count(c.CustomerID)
FROM Product p
INNER JOIN Customer c ON c.CustomerID = p.CustomerID
LEFT JOIN Address a ON a.CustomerID = c.CustomerID
AND a.AddressID =
(
SELECT MAX(AddressID)
FROM Address z
WHERE z.CustomerID = a.CustomerID
)
WHERE p.ProductID = 101
GROUP BY a.State