【发布时间】: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