Как получить последние записи детей с родительской записью из базы данных - PullRequest
3 голосов
/ 14 апреля 2011

У меня есть база данных с двумя таблицами: Customers (Id PK, LastName) а также Orders (Id PK, CustomerId FK, ProductName, Price, etc.)

Я хочу получить информацию о заказах только последнего клиента вместе с именем клиента. Я использую .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), и с каждым столбцом запрос увеличивается и медленнее, потому что мне нужно добавить следующие подзапросы.

Есть ли лучший способ?

Ответы [ 2 ]

6 голосов
/ 14 апреля 2011

В 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
        )
0 голосов
/ 14 апреля 2011

У вас нет даты столбца в таблице заказов, например, order_date? Вместо выбора вершины вы можете получить, используя max (order_date)

Мой sql ржавый, но как-то так

select c.col1,o.col1,o.col2,o.col3 from Customers as c, Orders as o where c.id = o.customerid and max(o.order_date)
...