SQL Server 2008 - 从连接表中获取最新记录

use*_*786 2 sql-server

我有一个SQL Server 2008数据库.该数据库有两个名为Customer和Order的表.这些表定义如下:

Customer
--------
ID,
First Name,
Last Name

Order
-----
ID,
CustomerID,
Date,
Description
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个返回数据库中所有客户的查询.如果用户至少下了一个订单,我想返回与最近下订单相关的信息.目前,我有以下内容:

SELECT
  *
FROM
  Customer c LEFT OUTER JOIN Order o ON c.[ID]=o.[CustomerID]
Run Code Online (Sandbox Code Playgroud)

如您所想,这将返回与客户相关的所有订单.但实际上,我只想要最新的一个.我如何在SQL中执行此操作?

谢谢!

Mar*_*ers 6

这是一种不假设订单日期是唯一的方法:

SELECT
    Customer.ID CustomerID,
    Customer.FirstName,
    Customer.LastName,
    T1.ID OrderID,
    T1.Date OrderDate,
    T1.Description OrderDescription
FROM Customer
LEFT JOIN (
    SELECT
        *,
        ROW_NUMBER() OVER (PARTITION BY CustomerId ORDER BY Date DESC) AS rn
    FROM [Order]
) T1
ON Customer.ID = T1.CustomerID AND T1.rn = 1
Run Code Online (Sandbox Code Playgroud)

结果:

CustomerID  FirstName   LastName   OrderID  OrderDate   OrderDescription  
1           FirstName1  LastName1  2        2010-05-02  Description2      
2           FirstName2  LastName2  3        2010-05-03  Description3      
3           FirstName3  LastName3  NULL     NULL        NULL              
Run Code Online (Sandbox Code Playgroud)

测试数据:

CREATE TABLE Customer (ID INT NOT NULL, FirstName VARCHAR(100) NOT NULL, LastName VARCHAR(100) NOT NULL);
INSERT INTO Customer (ID, FirstName, LastName) VALUES
(1, 'FirstName1', 'LastName1'),
(2, 'FirstName2', 'LastName2'),
(3, 'FirstName3', 'LastName3');

CREATE TABLE [Order] (ID INT NOT NULL, CustomerID INT NOT NULL, Date DATE NOT NULL, Description NVARCHAR(100) NOT NULL);
INSERT INTO [Order] (ID, CustomerID, Date, Description) VALUES
(1, 1, '2010-05-01', 'Description1'),
(2, 1, '2010-05-02', 'Description2'),
(3, 2, '2010-05-03', 'Description3'),
(4, 2, '2010-05-03', 'Description4');
Run Code Online (Sandbox Code Playgroud)