2

我正在为 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

它告诉我

使用了核心 SQL-99 之外的以下功能:
T611,基本 OLAP 操作
F391,长标识符

以下是 T611 Elementary OLAP 操作中包含的事物的定义:

  • 窗口函数(ROW_NUMBER、RANK 和 DENSE_RANK)
  • 未命名的窗口规格:
    • 窗口分区(PARTITION BY)
    • 窗口排序(ORDER BY)
    • 窗框(ROWS/RANGE PRECEDING/FOLLOWING)
  • 空序

我不确定我收到“长标识符”错误的确切原因,但这里有一个来自 Microsoft 的链接,上面有一些东西。

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

不知道这是否真的有助于考试,但我对答案很感兴趣。

4

5 回答 5

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
于 2012-11-28T06:42:19.527 回答
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。

而且,我刚刚通过了有问题的考试。

于 2015-12-20T09:59:11.767 回答
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

ORDER BY是一个基本的 OLAP 操作。您可以安全地删除它,您的数据可能不会以您想要的方式显示。

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

于 2012-11-28T06:51:30.517 回答
0

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

于 2012-11-28T10:52:06.050 回答