【发布时间】:2018-08-30 23:46:24
【问题描述】:
我对任何数据库都有一个简单的查询,它总是在 MySQL 而不是 SQL Server 中运行
select
tagalerts.id,
ts,
assetid,
node.zonename,
battlevel
from tagalerts, node
where
ack=0 and
tagalerts.nodeid=node.id
group by assetid
order by ts desc
错误是:
列 tagalerts.id 在选择列表中无效,因为它不包含在聚合函数或 group by 子句中。
将tagalerts.id 添加到group by 子句不是一个简单的情况,因为ts 和assetid 等的错误重复,这意味着所有选择都需要在一个组或聚合函数中...其中任何一个都会导致毫无意义和不准确的结果。
将选择拆分为子查询以正确排序和分组(这同样适用于 MySQL,正如您所期望的那样)会使事情变得更糟
SELECT * from
(select
tagalerts.id,
ts,
assetid,
node.zonename,
battlevel
from tagalerts, node
where
ack=0 and
tagalerts.nodeid=node.id
order by ts desc
)T1
group by assetid
order by 子句在视图、内联函数、派生表和表达式中无效,除非使用 TOP 等
“正确的输出”应该是
id ts assetid zonename battlevel
1234 a datetime 1569 Reception 0
3182 another datetime 1572 Reception 0
要么我完全错误地阅读 SQL Server 的规则,要么这是该数据库的主要缺陷。
如何编写此代码以在两个系统上工作?
【问题讨论】:
-
将
Order By移动到group by下的外部查询中,但分组仍然会出错。 -
恰恰相反,漏洞在mysql。如果您使用跨三列的聚合,则只需要按其他列分组才有意义。如果其他列的值超过 1 个,如果没有分组依据,则返回哪个值?
-
你想要什么结果,为什么要使用 group by?
-
谢谢,但这会导致 T1.id 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在按 cluase 分组中
-
MySql 允许你在这里做的事情实际上违反了 SQL 标准。 Sql Server 方式(要求您使用聚合函数,如
MAX()或AVG()与不在group by中的列)是正确的。
标签: mysql sql-server