2012-11-28 35 views
2

我正在學習SQL Server查詢考試,並從網站上獲得了一些練習題的演示。其中一個問題要求從兩個表格(CustomersOrders)中拉出,使用第一個初始值作爲別名,爲每個客戶查找最近的訂單,並使用最近的訂單先訂購。 Adventureworks有這樣的表格(Sales.SalesOrderHeaderSales.Customer),所以我創建了這個查詢並認爲我已經解決了。將T-SQL查詢轉換爲ANSI SQL-99標準

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)
  • 空訂貨

我不知道,爲什麼我收到了「長標識符」的錯誤,但在這裏是從微軟有它的一些東西,一個鏈接的確切原因。

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

IDK如果這實際上將幫助在考試或沒有,但我感興趣的答案。

+2

我不是ANSI 99標準的天才,但它不支持GROUP BY,JOIN + MAX ......你還需要什麼來解決你的問題? – Najzero

+1

「使用Core SQL-99之外的以下功能:」 - 這些功能是SQL-99的一部分。它們是可選的,因此實現不必支持它們。核心SQL-99是所有實現都需要支持的SQL-99位,但SQL-99遠遠超過了Core SQL-99,並且從您的問題中可以看出,您是否可以使用它。 – hvd

+0

感謝您的澄清,我不知道有什麼不同。它沒有在問題中指定。 – bpfrenchak

回答

3

以前接受的這個問題的答案時AdventureWorks示例數據庫

列「SalesLT.SalesOrderHeader.OrderDate」上測試產生錯誤是在ORDER BY無效子句 ,因爲它不包含在任一一個聚合函數或GROUP 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驗證測試,但只有當我用一個簡短的名稱,如MROD爲最大(O .OrderDate)別名,而不是MostRecentOrderDate。

還有,我剛剛通過了考試。

+0

F391出現向後兼容性,可以安全地忽略。 SQL-89只允許標識符長達18個字符。 SQL-99允許標識符長度爲128個字符。 – JamieSee

3

長標識符錯誤是由於標識符長度多於30個字符。 嘗試此查詢它的工作原理::

SELECT 
    c.CustomerID, 
    MAX(o.OrderDate) AS mrod 
FROM 
    SalesOrderHeader o 
INNER JOIN 
    Customer c ON o.CustomerID = c.CustomerID 
group by c.customerID 
ORDER BY 
    o.OrderDate DESC 
+0

+1只是在給定的SQL-99驗證器中嘗試了完全相同的東西,以確保 – Najzero

+0

有兩個問題之一與標識符長度和另一個用法的分析功能 –

+0

有什麼愚蠢的是,該問題要求具體名稱'MostRecentOrderDate'爲領域的名字。非常感謝!!! – bpfrenchak

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 
+0

這將返回與原始查詢不同的結果。 –

+0

我認爲這也是對的。 – bpfrenchak

0

ORDER BY是一個基本OLAP操作。您可以安全地將其刪除,您的數據可能無法以您喜歡的方式顯示。

長標識符錯誤是因爲您引用了INFORMATION_SCHEMA.INFORMATION_SCHEMA_CATALOG_NAME。換句話說,你的Sales.SalesOrderHeader位。您應該只能引用信息模式目錄名稱,在您的情況下爲SalesOrderHeaderCustomer,而不指定Sales.

0

通過SQL-99他們可能只是意味着用戶INNER JOIN和ON而不是加入WHERE子句。