簡體   English   中英

將T-SQL查詢轉換為ANSI SQL-99標准

[英]Convert T-SQL query to ANSI SQL-99 standard

我正在學習SQL Server查詢考試,並且從網站上獲得了一些練習題的演示。 其中一個問題要求從兩個表(“ Customers和“ Orders )中提取數據,並使用第一個首字母作為別名,查找每個客戶的最新訂單,然后以最新訂單為先進行排序。 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

它告訴我

使用了Core SQL-99之外的以下功能:
T611,基本OLAP操作
F391,長標識符

這是T611基本OLAP操作中包含的內容的定義:

  • 窗口函數(ROW_NUMBER,RANK和DENSE_RANK)
  • 未命名的窗口規格:
    • 視窗分割(PARTITION BY)
    • 窗口排序(ORDER BY)
    • 窗口框架(行/范圍優先/跟隨)
  • 空序

我不確定出現“ Long Identifiers”錯誤的確切原因,但這是Microsoft的鏈接,其中包含一些內容。

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

知道這是否對考試有實際幫助,但是我對答案很感興趣。

長標識符錯誤是由於標識符長度超過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

在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作為max(O.OrderDate)別名)而不是MostRecentOrderDate時才通過。

而且,我剛剛通過了相關考試。

試試這個查詢:

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

您的ORDER BY是基本的OLAP操作。 您可以放心地刪除它,因為數據可能不會以您想要的方式顯示。

長標識符錯誤是因為您正在引用INFORMATION_SCHEMA.INFORMATION_SCHEMA_CATALOG_NAME 換句話說,您的Sales.SalesOrderHeader位。 你應該能夠只是參考信息模式的目錄名稱,你的情況SalesOrderHeaderCustomer沒有指定Sales.

在SQL-99中,它們可能只是表示用戶INNER JOIN和ON,而不是加入WHERE子句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM