我有一个针对SQL Server的jsp中运行的select语句(以前使用MySql却没有问题)。
之所以添加了TOP 1,是因为否则SQL Server会抱怨order by子句(但仅当在jsp中显示结果时,而不是在SQL Server Management Studio中运行查询时)。
此查询在SQL Server Management Studio中运行正常
SELECT TOP 1
alerts.id,
alerts.ts,
asset_firstname,
asset_lastname,
assetid,
alerttype.name,
node.zonename,
node.ipaddress,
node.zonegroupid
from
alerts, asset, alerttype, node, alertrules
where
ack=0 and
alerts.nodeid = node.id and
alerts.alerttypeid = alerttype.id and
alertrules.alerttypeid = alerts.alerttypeid and
alerts.assetid = asset.id and
alerts.alerttypeid = 1 and
asset.id=1157 and
alertrules.userid = 1
order by alerts.ts desc
但是,当在jsp中运行时,它返回“列alerts.ts在选择列表中无效,因为它既不在聚合函数中也不在GROUP BY子句中。”
我不希望将alert.ts汇总或分组,因此不希望使用“正确”的select语句。
如果我删除了TOP 1或alert.ts des,查询将返回错误的行(最早而不是最新记录)
转换应该是简单易懂的基本SQL命令,以便它们与SQL Server一起正常运行是一个噩梦。
任何想法都很感激。
问候 拉尔夫
答案 0 :(得分:0)
(我将其写为答案,因为发表评论会很混乱) 您正在使用旧式联接,并且具有多余的检查。也许这可以有所作为(不确定,因为这似乎与JSP有关):
SELECT TOP(1)
alerts.id, alerts.ts,
asset_firstname,
asset_lastname,
assetid,
alerttype.name,
node.zonename,
node.ipaddress,
node.zonegroupid
from alerts
inner join asset on alerts.assetid = asset.id
inner join alerttype on alerts.alerttypeid = alerttype.id
inner join node on alerts.nodeid = node.id
inner join alertrules on alertrules.alerttypeid = alerts.alerttypeid
where ack=0 and
alerts.alerttypeid = 1 and
asset.id=1157 and
alertrules.userid = 1
order by alerts.ts desc;