最近加入日期的INNER JOIN ID

时间:2019-11-17 23:34:47

标签: mysql sql sql-server relational-database greatest-n-per-group

–价格(产品ID ,日期) –产品(产品ID ,名称)

假设我们有上面的表,如果我想在价格表中选择每种产品的ID和最近的日期,我将如何将这两个表进行内联接?

我有以下代码,并且在GROUP BY行上收到语法错误。

SELECT Product.prodId, Price.price, Price."date"
FROM Product 
INNER JOIN Price 
    INNER JOIN(
    SELECT Price.price, max("date") as currentPrice)cp
GROUP BY Price.prodId
ON Product.prodID = Price.prodId
ORDER BY Product.prodID;

我认为它与嵌套的INNER JOIN有关,因为这是我第一次尝试使用它,但无法在线找到答案。

2 个答案:

答案 0 :(得分:1)

通常,最有效的方法是联接表并使用相关的子查询进行过滤:

select p.*, i.*
from product p
inner join price i 
    on  i.prodID = p.prodID
    and i.date = (
        select max(i1.date) from price i1 where i1.prodID = i.prodID
    )

为了提高性能,您希望在price(prodID, date)上建立索引。

答案 1 :(得分:1)

尽管还有其他表达此查询的方法,但是您已经开始了单独的子查询的路径以获取最大日期。正确的语法如下所示:

SELECT p.prodId, pr.price, pr."date"
FROM Product p INNER JOIN
     Price  pr
     ON p.prodID = pr.prodId JOIN
     (SELECT pr2.prodId, max("date") as max_date
      FROM Price pr2
      GROUP BY pr2.prodId
     ) cp
     ON pr2.prodId = pr.prodID and pr2.max_date = pr.date
ORDER BY p.prodID;

您的查询刚刚结束。 GROUP BY应该在子查询中,例如,该子查询缺少FROM子句。