将T-SQL查询转换为ANSI SQL-99标准

时间:2012-11-28 06:34:56

标签: sql sql-server tsql

我正在攻读SQL Server查询考试,我从网站上获得了一些练习题的演示。其中一个问题要求从两个表(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

它告诉我

  

使用Core SQL-99之外的以下功能:
  T611,初级OLAP操作
  F391,长标识符

以下是T611基本OLAP操作中包含的内容的定义:

  • 窗口功能(ROW_NUMBER,RANK和DENSE_RANK)
  • 未命名的窗口规格:
    • 窗口分区(PARTITION BY)
    • 窗口订购(ORDER BY)
    • 窗框(ROWS / RANGE PRECEDING / FOLLOWING)
  • null ordering

我不确定我收到“长标识符”错误的确切原因,但这里有一个微软的链接,其中包含一些内容。

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

如果这确实对考试有帮助,请试试,但我对答案很感兴趣。

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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用于max(O.OrderDate)别名,而不是MostRecentOrderDate。

而且,我刚刚通过了考试。

答案 2 :(得分: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

答案 3 :(得分:0)

您的ORDER BY是一项基本的OLAP操作。您可以安全地删除它,您的数据可能无法以您希望的方式显示。

长标识符错误是因为您引用了INFORMATION_SCHEMA.INFORMATION_SCHEMA_CATALOG_NAME。换句话说,你的Sales.SalesOrderHeader位。您应该能够在SalesOrderHeaderCustomer的情况下仅引用信息架构目录名称,而无需指定Sales.

答案 4 :(得分:0)

通过SQL-99,他们可能只是意味着用户INNER JOIN和ON而不是加入WHERE子句。