【问题标题】:Join between two tables where the 'where' condition contains a MAX value在“where”条件包含 MAX 值的两个表之间连接
【发布时间】:2017-09-17 13:43:46
【问题描述】:

我有两张表,MEMBER 和 ORDER,我想从 MEMBER 中返回 Member_ID 和 Name,以及 ORDER 中该成员的最新订单日期。

例子:

会员:

Member_ID     Name
001           Fred
002           Joe
003           Dave

订单:

Member_ID   Order_ID    Date
001         0001        01/01/2017
001         0002        15/02/2017
002         0003        10/03/2017
003         0004        12/04/2017

我可以通过查询返回最近的订单:**Select MAX(DATE) From ORDER Where Member_ID = 001 GROUP BY Member_ID**

但是当我加入 Select 语句时,会返回 Member_ID '001' 的两行:

Select m.Member_ID, m.Name, o.DATE from MEMBER m
INNER JOIN ORDER o
ON m.Member_ID = o.Member_ID
Where o.DATE = (Select MAX(DATE) From ORDER Where Member_ID = 001 GROUP BY Member_ID)
AND m.Member_ID = 001

有人可以帮忙吗?

谢谢

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:

    您可以按照自己的方式前进。你想要一个相关子查询而不是group by:

    Select m.Member_ID, m.Name, o.DATE
    from members m join
         orders o
         on m.member_id = o.member_id
    Where o.DATE = (Select max(o2.DATE)
                    From orders o2
                    Where o2.Member_ID = o.member_id
                   ) and
          m.Member_ID = '001';
    

    在 SQL Server 中,使用窗口函数来表达这一点会更自然:

    Select m.Member_ID, m.Name, o.DATE
    from members m join
         (select o.*,
                 row_number() over (partition by member_id order by date desc) as seqnum
          from orders o
         ) o
         on m.member_id = o.member_id
    Where m.Member_ID = '001';
    

    或者因为你只想要最大日期,你可以只使用聚合(在任何数据库中):

    Select m.Member_ID, m.Name, max(o.DATE)
    from members m join
         orders o
         on m.member_id = o.member_id
    Where m.Member_ID = '001'
    group by m.Member_ID, m.Name;
    

    注意事项:

    • order 是 SQL Server 中的保留字 SQL 关键字。这是一张桌子的坏名字。我将表名更改为复数。
    • 如果member_id 以前导零开头,那么它是一个字符串,而不是一个数字。该值应用双引号括起来(或不使用前导零)。
    • 您的GROUP BY 子查询返回多个值,这将导致= 出错。
    • 根据您在表格中使用的名称,您的 JOIN 条件不正确。

    【讨论】:

    • 感谢您提供的信息。是的,我更正了连接条件。
    【解决方案2】:

    您在子查询中错过了 id 条件

    select a.member_id, a.name, b.order_id, b.date
    from member a left join order b on (a.member_id=b.member_id)
    where a.member_id=001
    and b.date in (select max(date) from order where member_id=001 group by member_id);
    

    【讨论】:

      【解决方案3】:

      要确定每个成员记录的最近日期,您可以使用 ROW_NUMBER() 并按日期按 DESCending 顺序排序,只选择第 1 行。

      SELECT m.member_id, 
             m.name, 
             o.date
       FROM members m 
       LEFT JOIN (SELECT *,
                         ROW_NUMBER() OVER (PARTITION BY member_id 
                                                ORDER BY date DESC) as rnum
                    FROM orders
                 ) o
         ON m.member_id = o.member_id
      WHERE o.rnum = 1 --this determines the most recent record of each member
        AND m.member_id = '001'; 
      

      【讨论】:

        猜你喜欢
        • 2021-10-26
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 2013-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        相关资源
        最近更新 更多