代码之家  ›  专栏  ›  技术社区  ›  pm100

使用group by和join进行查找的sql select

  •  1
  • pm100  · 技术社区  · 8 年前

    假设我有一个产品表和一个订单表。我想列出每种产品的最新订单

    我想是这样的

    select name, description, price, max(date) 
    from product 
      join order on order.item = product.name 
    group by order.item
    

    注意-我需要标准的可移植SQL,而不是特定于任何给定的引擎。

    4 回复  |  直到 8 年前
        1
  •  0
  •   wolf354    8 年前

    如果是Oracle或MS,则需要按所选字段中不是聚合函数的所有字段进行分组。 在“按订单”和“按p.名称、描述、价格、日期分组”之前,这将是一个额外的行。。。 关于博士后,我不太确定,但可能会奏效。

        2
  •  1
  •   Gordon Linoff    8 年前

    distinct on :

    select distinct on (o.item) p.name, description, price, date
    from product p join
         order o
         on o.item = p.name
    order by o.item, date desc;
    

    我在查询中添加了别名。我强烈建议您始终限定所有列名。我会那样做,但我不知道在大多数情况下他们来自哪里。

        3
  •  1
  •   a_horse_with_no_name    8 年前

    select *
    from (
        select p.name, p.description, p.price, 
               o.date, 
               max(o.date) over (partition by o.item) as last_date
        from product p
          join "order" o on o.item = p.name 
    ) t 
    where date = last_date;
    

    但在博士后 distinct on () 通常要快得多。

        4
  •  0
  •   Yogesh Sharma    8 年前

    可以使用相关子查询:

    select p.name, p.description, p.price, o.date
    from product p inner join
         order o
         on o.item = p.name
    where o.date = (select max(o1.date)
                    from order o1
                    where o1.item = p.name
                   );