【问题标题】:Last record query in two linked tables两个链接表中的最后一条记录查询
【发布时间】:2013-06-13 10:49:50
【问题描述】:

我有一张名为“Purchases”的表格:

PurchaseID、PurchaseDate、供应商

╔════════════╦══════════════╦════════╗
║ PurchaseID ║ PurchaseDate ║ Vendor ║
╠════════════╬══════════════╬════════╣
║          1 ║ 01 jan 2013  ║ XYZ    ║
║          2 ║ 02 jan 2013  ║ ABC    ║
╚════════════╩══════════════╩════════╝

以及使用 PurchaseID 键与其链接的表“PurchaseDetails”:

DetailID、PurchaseID、ProductCode、价格

╔══════════╦════════════╦═════════════╦═══════╗
║ DetailID ║ PurchaseID ║ ProductCode ║ Price ║
╠══════════╬════════════╬═════════════╬═══════╣
║        1 ║          1 ║         001 ║ 2.34  ║
║        2 ║          1 ║         002 ║ 3.75  ║
║        3 ║          2 ║         001 ║ 5.93  ║
║        4 ║          2 ║         002 ║ 8.14  ║
╚══════════╩════════════╩═════════════╩═══════╝

我想获取给定 ProductCode 的最后一个 PurchaseDate 的价格和供应商。

例如: 如果 ProductCode 是“001”,那么我希望查询返回: 5.93 | ABC

我尝试使用带有 DESC ORDER BY 的 TOP 1 SELECT,但我无法让 JOIN 部分工作。

【问题讨论】:

    标签: sql sql-server sql-server-2005 join inner-join


    【解决方案1】:

    使用 TOP1 方法,下面的查询应该可以工作

    SELECT Vendor, Price
    FROM Purchases p
    INNER JOIN PurchaseDetails pd on pd.PurchaseID=p.PurchaseID
    WHERE PurchaseID = (SELECT TOP 1 PurchaseID FROM Purchases WHERE DetailID = DetailID ORDER BY PurchaseDate DESC)
    

    您也可以使用Row_Number over 来实现此目的

    【讨论】:

    • 谢谢约翰的回答!
    【解决方案2】:

    这是我的解决方案:

    SELECT TOP 1 Purchases.Vendor, Purchases.PurchaseDate, PurchaseDetails.Price FROM PurchaseDetails INNER JOIN Purchases 
    ON PurchaseDetails.PurchaseID=Purchases.PurchaseID WHERE PurchaseDetails.ProductCode='001' ORDER BY Purchases.PurchaseDate DESC
    

    【讨论】:

      【解决方案3】:

      由于您使用的是 SQL Server 2005+,因此您可以使用窗口函数来获取结果。在这种情况下,我使用了row_number()

      select vendor, price
      from
      (
        select p.purchaseId, p.purchaseDate, p.vendor,
          d.productCode, d.price,
          row_number() over(partition by d.productCode order by p.purchaseDate desc) seq
        from purchases p
        inner join purchaseDetails d
          on p.purchaseId = d.purchaseId
      ) src
      where seq = 1;
      

      SQL Fiddle with Demo

      【讨论】:

        猜你喜欢
        • 2016-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多