2

私は SQL Server クエリ試験の勉強をしていて、Web サイトからいくつかの練習問題のデモを入手しました。質問の 1 つは、最初のイニシャルをエイリアスとして使用して 2 つのテーブル (CustomersOrders) からプルし、各顧客の最新の注文を見つけて、最新の注文から最初に注文するよう求めています。Adventureworksにはこのようなテーブル (Sales.SalesOrderHeaderSales.Customer) があるので、このクエリを作成し、解決したと考えました。

SELECT 
    c.CustomerID, 
    MAX(o.OrderDate) OVER (PARTITION BY c.customerid) AS MostRecentOrderDate
FROM 
    Sales.SalesOrderHeader o 
INNER JOIN 
    Sales.Customer c ON o.CustomerID = c.CustomerID
ORDER BY 
    OrderDate DESC

しかし...質問の最後に、ANSI SQL-99標準に準拠していることを確認するように言われています。

だから私はこのコードをチェックしました

http://developer.mimer.com/validator/parser99/index.tml#parser

そしてそれは私に言う

コア SQL-99 以外の次の機能が使用されます:
T611、基本的な OLAP 操作
F391、長い識別子

T611 基本 OLAP 操作に含まれるものの定義は次のとおりです。

  • ウィンドウ関数 (ROW_NUMBER、RANK、および DENSE_RANK)
  • 名前のないウィンドウの仕様:
    • ウィンドウの分割 (PARTITION BY)
    • ウィンドウ順序付け (ORDER BY)
    • ウィンドウ フレーミング (ROWS/RANGE PRECEDING/FOLLOWING)
  • null の順序付け

「Long Identifiers」エラーが発生する正確な理由はわかりませんが、Microsoft からのリンクにいくつかのものがあります。

http://msdn.microsoft.com/en-us/library/hh544365(v=sql.105).aspx

これが実際に試験に役立つかどうかはわかりませんが、私は答えに興味がありました.

4

5 に答える 5

3

この質問に対する以前に受け入れられた回答は、adventureworks サンプル データベースでテストするとエラーが発生します。

列 "SalesLT.SalesOrderHeader.OrderDate" は、集計関数にも GROUP BY 句にも含まれていないため、ORDER BY 句では無効です。

order by条項に問題があります。を使用して修正できます

select C.LastName, max(O.OrderDate) as MROD
from SalesLT.Customer C inner join SalesLT.SalesOrderHeader O
on C.CustomerID = O.CustomerID
group by C.LastName
order by max(O.OrderDate) Desc

また

select C.LastName, max(O.OrderDate) as MROD
from SalesLT.Customer C inner join SalesLT.SalesOrderHeader O
on C.CustomerID = O.CustomerID
group by C.LastName
order by MROD Desc

これらの例はどちらも sql-99 バリデーター テストに合格しますが、MostRecentOrderDate の代わりに max(O.OrderDate) エイリアスに MROD などの短い名前を使用した場合のみです。

また、問題の試験に合格したばかりです。

于 2015-12-20T09:59:11.767 に答える
0

あなたORDER BYは基本的なOLAP操作です。安全に削除できます。データが希望どおりに表示されない場合があります。

長い識別子のエラーは、を参照しているためですINFORMATION_SCHEMA.INFORMATION_SCHEMA_CATALOG_NAME。言い換えれば、あなたのSales.SalesOrderHeaderビット。SalesOrderHeader場合によっては、Customerを指定せずに、情報スキーマカタログ名を参照できるはずですSales.

于 2012-11-28T06:51:30.517 に答える
0

このクエリを試してください:

select c.CustomerID, 
       MAX(o.OrderDate), 
from  SalesOrderHeader o
INNER JOIN Customer c ON o.CustomerID = c.CustomerID
group by o.CustomerID 
ORDER BY 2 DESC
于 2012-11-28T06:49:53.750 に答える
0

SQL-99では、WHERE 句に参加するのではなく、ユーザーの INNER JOIN と ON を意味するだけかもしれません。

于 2012-11-28T10:52:06.050 に答える