[英]Convert T-SQL query to ANSI SQL-99 standard
我正在學習SQL Server查詢考試,並且從網站上獲得了一些練習題的演示。 其中一個問題要求從兩個表(“ Customers
和“ Orders
)中提取數據,並使用第一個首字母作為別名,查找每個客戶的最新訂單,然后以最新訂單為先進行排序。 Adventureworks
具有與此類似的表( Sales.SalesOrderHeader
和Sales.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操作中包含的內容的定義:
我不確定出現“ 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
位。 你應該能夠只是參考信息模式的目錄名稱,你的情況SalesOrderHeader
和Customer
沒有指定Sales.
。
在SQL-99中,它們可能只是表示用戶INNER JOIN和ON,而不是加入WHERE子句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.