【问题标题】:Most recent record in a left join左连接中的最新记录
【发布时间】:2010-10-18 00:44:48
【问题描述】:

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

Customer (CustomerID, FirstName, LastName)
Address (AddressID, CustomerID, Line1, City, State)
Product (ProductID, CustomerID, Description)

一个客户可以有多个送货地址和多个产品。

我想做的是列出每个州的客户数量,其中州由最近的地址记录确定。例如“每个州有多少客户最后收到产品?”。因此,我对客户之前的任何地址记录都不感兴趣,只对最近的(由 AddressID 确定)感兴趣。

State | Number of Customers
--------------------------
CA    | 32
GA    | 12
TX    | 0
OH    | 18

我通常会这样做:

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

但是,由于客户可能有多个地址,客户是否只计入最近地址记录的状态?

附:以上纯粹是一个示例场景,用于轻松解释我试图实现的连接,并不反映实际的系统设计。

【问题讨论】:

    标签: sql sql-server sql-server-2005


    【解决方案1】:

    试试这个:

    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
    

    【讨论】:

    • 太棒了!现在,为什么我没有想到这个!
    • 这很整洁。向你致敬。
    • 优秀。你帮了我很多。谢谢
    • 不适用于 oracle:ora-01799 a column may not be outer-joined to a subquery
    【解决方案2】:

    你也可以试试(假设我没记错我的 SQLServer 语法):

    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
    

    【讨论】:

      【解决方案3】:

      如果没有 Orders 和 OrderDetails 表,我不明白如何做到这一点。 Orders 表将包含 CustomerID ShippingDate 和 ShipToAddressID,而 OrderDetails 将包含 OrderID 和 ProductID。然后,您需要一个嵌套查询来确定最近的订单(以及最近的地址),将其连接到订单详细信息以获取订购的产品,然后过滤您关心的产品。

      【讨论】:

      • 您是对的,但所描述的场景纯粹是一个示例,试图轻松解释我想要实现的目标。我已经用 P.S. 更新了我原来的问题。解释这一点。
      猜你喜欢
      • 1970-01-01
      • 2019-07-14
      • 2016-07-28
      • 2015-03-14
      • 1970-01-01
      • 2020-05-22
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      相关资源
      最近更新 更多