Entity SQL: ORDER BY в подзапросе не поддерживается? - PullRequest
2 голосов
/ 08 февраля 2012

В качестве примера, скажем, я использую Entity SQL (не LINQ или T-SQL) для запроса базы данных Northwind.Я хочу получить дату заказа и название компании для всех заказов, размещенных в самые последние 5 дат, которые существуют в базе данных .Это довольно просто в T-SQL, но мне очень трудно разобраться, как это сделать в Entity SQL, и я был бы признателен за любые указатели.

Вот запрос, который генерирует мой код:

SELECT [T_Orders].[OrderDate], [T_Orders].[ShippedDate], [T_Customers].[CompanyName]
FROM [NorthwindContext].[Orders] AS [T_Orders]
INNER JOIN [NorthwindContext].[Customers] AS [T_Customers] ON [T_Customers].[CustomerID] = [T_Orders].[CustomerID]
WHERE [T_Orders].[OrderDate] IN 
    (SELECT VALUE DISTINCT [S_Orders].[OrderDate]
     FROM [NorthwindContext].[Orders] AS [S_Orders] 
     ORDER BY [S_Orders].[OrderDate] DESC LIMIT(5))
ORDER BY [T_Orders].[OrderDate] ASC SKIP(@skip) LIMIT(@limit)

Это приводит меня к следующей ошибке:

'S_Orders.OrderDate' не может быть разрешен в текущей области или контексте.Убедитесь, что все ссылочные переменные находятся в области видимости, что необходимые схемы загружены и что на пространства имен ссылаются правильно.Рядом с выражением доступа к члену, строка 5, столбец 143.

Если я уберу предложение ORDER BY / LIMIT в подзапросе, я не получу ошибок, и мой запрос вернет все строки в таблице.Если добавить ТОП (5) к SELECT в подзапросе, то я получу самые старые 5 дат, но не самые последние 5 дат.

Может кто-нибудь сказать мне, что я ошибся в своей сущностиСинтаксис SQL или предложить другой способ получения желаемых результатов с помощью Entity SQL?

Обновление

Благодаря советам Тит Лвин Оо я смог выработатьследующий запрос, который помог мне.

SELECT [T_Orders].[OrderDate], [T_Orders].[ShippedDate], [T_Customers].[CompanyName]
FROM [NorthwindContext].[Orders] AS [T_Orders]
INNER JOIN [NorthwindContext].[Customers] AS [T_Customers] ON [T_Customers].[CustomerID] = [T_Orders].[CustomerID]
INNER JOIN
(
    SELECT [T_Orders].[OrderDate]
    FROM [NorthwindContext].[Orders] AS [T_Orders]
    GROUP BY [T_Orders].[OrderDate]
    ORDER BY [T_Orders].[OrderDate] DESC LIMIT(5)
) AS REC ON ([T_Orders].[OrderDate] = REC.[OrderDate])

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Понятно.Как насчет этого.

SELECT [T_Orders].[OrderDate], [T_Orders].[ShippedDate], [T_Customers].[CompanyName]
FROM [NorthwindContext].[Orders] AS [T_Orders]
INNER JOIN [NorthwindContext].[Customers] AS [T_Customers] ON [T_Customers].[CustomerID] = [T_Orders].[CustomerID]
INNER JOIN
(
    SELECT TOP(5) MAX([T_Orders].[OrderDate]) AS [OrderDate]
    FROM [NorthwindContext].[Orders] AS [T_Orders]
    GROUP BY [T_Orders].[CustomerID]
) AS REC ON ([T_Orders].[OrderDate] = REC.[OrderDate])
0 голосов
/ 08 февраля 2012

Не могли бы вы попробовать это?

SELECT [T_Orders].[OrderDate], [T_Orders].[ShippedDate], [T_Customers].[CompanyName]
FROM [NorthwindContext].[Orders] AS [T_Orders]
INNER JOIN [NorthwindContext].[Customers] AS [T_Customers] ON [T_Customers].[CustomerID] = [T_Orders].[CustomerID]
INNER JOIN
(
    SELECT TOP 5 [T_Orders].[CustomerID], MAX([T_Orders].[OrderDate]) [OrderDate]
    FROM [NorthwindContext].[Orders] AS [T_Orders]
    GROUP BY [T_Orders].[CustomerID]
) REC ON ([T_Customers].[CustomerID] = REC.[CustomerID] AND [T_Orders].[OrderDate] = REC.[OrderDate])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...