Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 左联接中的最新记录_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql 左联接中的最新记录

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) 一个客户可以有多个交货地址和多个产品 我想做的是列出每个州的客户数量,该州由最近的地址记录确定。例如“每个州最近收到一个产品的客户有多少?”。因此,我对客户以前的地址记录不感

假设我在SqlServer中有以下3个表:

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