我正在攻读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操作中包含的内容的定义:
我不确定我收到“长标识符”错误的确切原因,但这里有一个微软的链接,其中包含一些内容。
http://msdn.microsoft.com/en-us/library/hh544365(v=sql.105).aspx
如果这确实对考试有帮助,请试试,但我对答案很感兴趣。
答案 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
位。您应该能够在SalesOrderHeader
和Customer
的情况下仅引用信息架构目录名称,而无需指定Sales.
。
答案 4 :(得分:0)
通过SQL-99,他们可能只是意味着用户INNER JOIN和ON而不是加入WHERE子句。