【问题标题】:INNER JOIN ID with most recent date具有最近日期的 INNER JOIN ID
【发布时间】:2019-11-17 23:34:47
【问题描述】:

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

假设我们有上面的表,如果我想在 Price 表中选择每个产品的 ID 以及最近的日期,我将如何 INNER JOIN 这两个表?

我有以下代码,并且在 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 有关,因为这是我第一次尝试使用它但在网上找不到答案。

【问题讨论】:

  • mysql sql-server。请只保留与您的 RDBMS 对应的一个,然后删除另一个。

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


【解决方案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) 上建立索引。

【讨论】:

    【解决方案2】:

    虽然有其他方式来表达这个查询,但您已经开始沿着单独的子查询的路径来获取最大日期。正确的语法如下所示:

    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 子句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-07
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多