2013-02-15 59 views
0

我正在研究SQL Server 2008數據庫。我需要獲得客戶的特定訂單以及他們的最新訂單ID和最新訂單數據。我的挑戰在於,我需要一行中的數據。目前,我想下面的查詢:帶有最新記錄的嵌套查詢

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]'? – 2013-02-15 16:49:48

+0

您是否在尋找最新的'ID'或最新'CreatedON'的日期?哪一個? – 2013-02-15 16:51:40

回答

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 2013-02-15 17:02:42

+0

永遠不會知道。我見過ID = CustomerID的系統,所以我不評判:)。我個人也喜歡FROM TableA JOIN TableB語法比FROM TableA,TableB語法更好。 – 2013-02-15 17:10:04

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子句連接表。更好地使用'加入' – Kaf 2013-02-15 17:04:11

+0

@Kaf是的我同意,但我只是正確地在他的查詢 – 2013-02-18 08:38:08