需要修复一个子查询,无法弄清楚出了什么问题

时间:2014-04-06 01:04:54

标签: mysql sql

我使用了一个子查询,它返回在Orders表中可以找到的活动最后一天的所有订单。

以下是我提出的建议:

SELECT orderid, orderdate, customerid, employeeid
FROM Orders
WHERE orderdate = MAX(orderdate);

这是我收到的: Msg 147,Level 15,State 1,Line 3 聚合可能不会出现在WHERE子句中,除非它位于HAVING子句或选择列表中包含的子查询中,并且要聚合的列是外部引用。

我哪里出错了?

2 个答案:

答案 0 :(得分:1)

您的错误大致转换为:除非您使用MAX()等,否则无法使用GROUP BY

所以这是一种快速重写查询的方法:

SELECT orderid, orderdate, customerid, employeeid
FROM Orders
WHERE orderdate = (SELECT TOP 1 orderdate FROM Orders ORDER BY orderdate DESC);

但是你的订单日期可能有时间戳,所以我也会加上这个:

SELECT orderid, orderdate, customerid, employeeid
FROM Orders
WHERE orderdate = DATEADD(dd, 0, DATEDIFF(dd, 0, (SELECT TOP 1 orderdate FROM Orders ORDER BY orderdate DESC)));

我意识到这不是MySQL,但我希望你或其他人能够为你重写这个解决方案。

答案 1 :(得分:1)

@Trafz的答案很接近,但它没有专门针对MySQL工作(LIMIT 1不是TOP 1)。同样,根据您的表的大小,您正在使用的存储引擎以及您拥有的索引,您实际上可能会更好地使用联接,例如,

SELECT orderid, a.orderdate, customerid, employeeid
FROM Orders AS a
INNER JOIN (SELECT MAX(orderdate) as orderdate FROM Orders) AS b
ON a.orderdate = b.orderdate
;

后者应该适用于所有主要的SQL实现(关于TOP / LIMIT的语法之间存在一些差异),它可能会让你进一步使用SQL优化器......但即使不是,它也不会成为更糟糕的是