2013-02-15 5 views
0

Я работаю над базой данных SQL Server 2008. Мне нужно получить конкретный заказ для клиента и их последний идентификатор заказа и последние данные заказа. Мой вызов здесь, мне нужны данные в одной строке. В настоящее время я пытаюсь следующий запрос:Вложенный запрос с последней записью

SELECT 
    o.*, 
    c.[FirstName], 
    c.[LastName], 
    c.[PlayerName], 
    (SELECT TOP 1 o2.CreatedDate, o2.ID FROM [Order] o2 ORDER BY [CreatedOn] DESC) 
FROM 
    [Order] o, 
    [Customer] c 
WHERE 
    o.[ID]=c.[CustomerID] 

Когда я выполнить этот запрос, я получаю следующее сообщение об ошибке:

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS. 

Как вы можете себе представить, есть сценарии, где клиент не будет иметь предыдущий заказ. Как это сделать и получить результат в одну строку?

Спасибо!

+0

Вы уверены: 'o. [ID] = c. [CustomerID]'? –

+0

Вы ищете новейшую 'ID' или последнюю дату 'CreatedON'? который из? –

ответ

2

Немного другой способ сделать это с помощью CTE.

WITH LatestOrder AS (SELECT TOP 1 * FROM [Order] ORDER BY [CreatedOn] DESC) 
SELECT 
    o.*, 
    c.[FirstName], 
    c.[LastName], 
    c.[PlayerName], 
    lo.CreatedDate, 
    lo.ID 
FROM [Order] o 
JOIN [Customer] c 
    ON o.[ID]=c.[CustomerID] 
CROSS JOIN LatestOrder lo 
+0

+1 для использования' CTE' для перекрестного соединения. Я думаю, это очень эффективно. Также я думаю, что 'o. [ID] = c. [CustomerID]' является ошибкой, которая не является вашей виной в любом случае .... – Kaf

+0

Никогда не знаю. Я видел системы, где ID = CustomerID, поэтому я не сужу :). Лично мне также нравится синтаксис FROM TableA JOIN TableB MUCH лучше, чем синтаксис FROM TableA, TableB. –

2
SELECT 
    o.*, 
    c.[FirstName], 
    c.[LastName], 
    c.[PlayerName], 
    (SELECT TOP 1 o2.CreatedDate FROM [Order] o2 ORDER BY [CreatedOn] DESC), 
    (SELECT TOP 1 o2.ID FROM [Order] o2 ORDER BY [CreatedOn] DESC) 
FROM 
    [Order] o, 
    [Customer] c 
WHERE 
    o.[ID]=c.[CustomerID] 

Ошибка заключается в том, что вы не можете выбрать два поля в своем подзапросе. Поэтому вы должны делать это отдельно.

+0

Объединение таблиц с предложением where не рекомендуется. Лучше использовать 'Join' – Kaf

+0

@Kaf Да, я согласен, но я был просто правильно синтаксической ошибкой в ​​его запросе –