【问题标题】:Joining to MAX record by date and joining to another table按日期加入 MAX 记录并加入另一个表
【发布时间】:2015-10-14 18:12:13
【问题描述】:

我有类别和产品表。我想根据类别在一行中获取具有最大日期的产品记录。如果根本没有产品,我至少想显示类别。产品的 ID 将为 NULL,因为一旦没有记录,ProductDate 也会为 NULL。

我尝试了这个脚本,但没有得到任何东西(我没有作为@ID 传递的类别的产品)。如果我将 INNER JOIN 更改为 LEFT JOIN,我将获得所有类别并包括所有最大产品。我应该只得到一条记录,因为我正在按 ID 过滤

SELECT  c.ID AS CategoryID,
        p.ID AS ProductID,
        p.Date AS ProductDate,
FROM Category c
LEFT JOIN Product p
ON c.ID = p.CategoryID
INNER JOIN 
    (
        SELECT CategoryID, MAX(Date) AS MaxDate
        FROM Product
        WHERE CategoryID  = @ID
        GROUP BY CategoryID
    ) p2
    ON p.CategoryID = p2.CategoryID
WHERE c.ID = @ID
ORDER BY p.CategoryID, p.Date

如何才能让一条记录与类别匹配多于产品(因为我没有该类别的任何产品)?

例如

Category
C1 Cat1
C2 Cat2

Product
P1 Cat1 Prod1 2015-01-01 ...
P2 Cat1 Prod2 2015-10-01 ...
P3 Cat1 Prod1 2015-10-14 ...

Result
@ID = C2 (Category.ID)

CategoryID, ProductID, Date
C2, NULL, NULL

Result
@ID = C1

CategoryID, ProductID, Date
C1, P3, 2015-10-14

更新

我发现错误是因为我没有完全发布问题。我正在做这个额外的

 WHERE c.ID = @ID
 AND c.Inactive IS NULL OR (c.Inactive = 0)
 ORDER BY p.CategoryID, p.Date

我改成这个来解决问题

 WHERE c.ID = @ID
 AND (c.Inactive IS NULL OR c.Inactive = 0)
 ORDER BY p.CategoryID, p.Date

但是 Giorgi Nakeuri 的 answer,简化我的脚本。

【问题讨论】:

    标签: sql-server join max


    【解决方案1】:

    这里是outer apply 来帮助你。它专为此类工作而设计:

    select c.id as categoryid,
           o.id as productid,
           o.date as productdate 
    from categories c
    outer apply(select top 1 p.id, p.date
                from products p 
                where p.categoryid = c.id 
                order by p.date desc) o
    

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 2019-08-16
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      • 2019-10-14
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多