Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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 如何从数据库中获取具有父记录的最后一个子记录_Sql_Database_Linq To Sql - Fatal编程技术网

Sql 如何从数据库中获取具有父记录的最后一个子记录

Sql 如何从数据库中获取具有父记录的最后一个子记录,sql,database,linq-to-sql,Sql,Database,Linq To Sql,我有一个包含两个表的数据库: 客户(Id PK,姓氏) 及 订单(Id PK、CustomerId FK、产品名称、价格等) 我只想检索客户的上次订单详细信息以及客户名称。 我使用.NET L2SQL,但我认为这是SQL问题,而不是LINQ问题,所以我在这里发布了我尝试过的SQL查询: SELECT [t0].[LastName], ( SELECT [t2].[ProductName] FROM ( SELECT TOP (1) [t1].[ProductNam

我有一个包含两个表的数据库:
客户(Id PK,姓氏)
订单(Id PK、CustomerId FK、产品名称、价格等)

我只想检索客户的上次订单详细信息以及客户名称。 我使用.NET L2SQL,但我认为这是SQL问题,而不是LINQ问题,所以我在这里发布了我尝试过的SQL查询:

SELECT [t0].[LastName], (
    SELECT [t2].[ProductName]
    FROM (
        SELECT TOP (1) [t1].[ProductName]
        FROM [Orders] AS [t1]
        WHERE [t1].[CustomerId] = [t0].[Id]
        ORDER BY [t1].[Id] DESC
        ) AS [t2]
    ) AS [ProductName], (
    SELECT [t4].[Price]
    FROM (
        SELECT TOP (1) [t3].[Price]
        FROM [Orders] AS [t3]
        WHERE [t3].[CustomerId] = [t0].[Id]
        ORDER BY [t3].[Id] DESC
        ) AS [t4]
    ) AS [Price]
FROM [Customers] AS [t0]
问题是Orders有更多的列(30),每列查询都会变得更大、更慢,因为我需要添加下一个子查询


有没有更好的方法?

在SQL Server 2005及更高版本中:

SELECT  *
FROM    (
        SELECT  o.*,
                ROW_NUMBER() OVER (PARTITION BY c.id ORDER BY o.id DESC) rn
        FROM    customers c
        LEFT JOIN
                orders o
        ON      o.customerId = c.id
        ) q
WHERE   rn = 1
或者这个:

SELECT  *
FROM    customers c
OUTER APPLY
        (
        SELECT  TOP 1 *
        FROM    orders o
        WHERE   o.customerId = c.id
        ORDER BY
                o.id DESC
        ) o
在SQL Server 2000中:

SELECT  *
FROM    customers с
LEFT JOIN
        orders o
ON      o.id = 
        (
        SELECT  TOP 1 id
        FROM    orders oi
        WHERE   oi.customerId = c.id
        ORDER BY
                oi.id DESC
        )

在SQL 2008中:只有第二个有效,第1个:为“q”多次指定了列“Id”。@jlp:try now。应该明确指定内部查询中需要的列。