Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2008-从联接表中获取最新记录_Sql Server - Fatal编程技术网

Sql server SQL Server 2008-从联接表中获取最新记录

Sql server SQL Server 2008-从联接表中获取最新记录,sql-server,Sql Server,我有一个SQL Server 2008数据库。该数据库有两个名为Customer和Order的表。这些表格的定义如下: Customer -------- ID, First Name, Last Name Order ----- ID, CustomerID, Date, Description 我正在尝试编写一个查询,返回数据库中的所有客户。如果用户至少下了一个订单,我想返回与最近下的订单相关的信息。目前,我有以下几点: SELECT * FROM Customer c LEFT

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

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

Order
-----
ID,
CustomerID,
Date,
Description
我正在尝试编写一个查询,返回数据库中的所有客户。如果用户至少下了一个订单,我想返回与最近下的订单相关的信息。目前,我有以下几点:

SELECT
  *
FROM
  Customer c LEFT OUTER JOIN Order o ON c.[ID]=o.[CustomerID]
可以想象,这将返回与客户关联的所有订单。但实际上,我只想要最近的一个。如何在SQL中实现这一点


谢谢大家!

我将使用where子句和Max()函数来保证最新添加的记录:

Select * from 
Customer C Left join 
(
    Select o.CustomerID, Description, Date from 
    Orders o inner join
    (
        Select CustomerID, Max(Date) as LastOrder
        From Orders Group by CustomerID
    ) SubLatest on o.CustomerID = SubLatest.CustomerID
    and o.Date = SubLatest.LastOrder 
    ) SubDetails 
on C.id = SubDetails.CustomerID
(你的代码…)
其中o.id=max(o.id)

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

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
结果:

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              
测试数据:

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');
我希望不是作业O)


希望这有帮助

您的查询只返回一个客户。OP写道:
我正在尝试编写一个返回数据库中所有客户的查询。
hmm我一定是误读了OP,我想他说的是最近的。同上。我知道一定有办法“获取最新ID”而不是“获取最新日期,然后找到与之匹配的ID”听起来很小气,但在大型数据集中重复日期是令人讨厌的。@MarkByers why not a我认为更具可读性这是行不通的:聚合可能不会出现在WHERE子句中,除非它出现在HAVING子句或select列表中包含的子查询中,并且被聚合的列是外部引用。
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');
Select  Top 1  C.*
              ,O.*
From    Customer C left outer join
        Order O on O.CustomerId = C.Id
Order by O.[Date] Desc