2016-06-27 4 views
1

マイSales.Customer表は、以下の列を含むクエリを取得する:サブクエリは

  • 得意(整数)
  • 姓(NVARCHAR(50))
  • 氏名(NVARCHAR(50))

Sales.SalesOrderテーブルには、次の列が含まれています

  • SalesOrderNumber(整数)
  • 受注日(日)
  • 得意先(整数)
  • 金額(金)

一部のお客様には、数年の期間にわたって複数の注文を配置しています。私は、各顧客が注文した上で最後の日付を取得するために、次のクエリを書いている:

SELECT c.CustomerID, c.FirstName, c.LastName, 
      -- correlated subquery goes here 
       AS LastOrderDate 
FROM Sales.Customer AS c; 

なぜ私のサブクエリは、私の実際のクエリを完了していないのですか?私は何かを逃しているのですか、それとも違うはずですか?

(SELECT MAX(o.OrderDate) 
    FROM Sales.SalesOrder AS o 
    WHERE o.CustomerID = c.CustomerID) 

私は私のソリューションが複雑すぎるかもしれないと考えていたので、代わりにこれが機能するはずですか?

(SELECT MAX(c.OrderDate) 
    FROM Sales.Customer AS c) 
+0

「mysql」または「sql-server」はどちらですか? – Blorgbeard

+0

お詫び申し上げます、それはsql-server、trans-sqlです。私はちょうどmysqlのタグを入れてみると、より多くのユーザーに表示されると思っていました。それは確かに評判に影響を与えるので、私はすぐにそれを削除します。 – jrodden

+0

OK。 「サブクエリが実際のクエリを完了しないのはなぜですか?」という意味が理解できません。最初のサブクエリはうまくいくはずです(2番目ではありません)。 – Blorgbeard

答えて

0

このようにCTEとして書き換えることができます。

;WITH LastOrderDate AS 
(
    SELECT CustomerID,MAX(OrderDate) AS LastOrderDate 
    FROM Sales.SalesOrder 
    GROUP BY CustomerID 

) 
SELECT c.CustomerID, c.FirstName, c.LastName, LastOrderDate 
       AS LastOrderDate 
FROM Sales.Customer AS c 
LEFT JOIN LastOrderDate l 
ON c.CustomerID = l.CustomerID;