【发布时间】:2013-03-19 18:38:37
【问题描述】:
我遇到过以下 SYBASE SQL:
-- Setup first
create table #t (id int, ts int)
go
insert into #t values (1, 2)
insert into #t values (1, 10)
insert into #t values (1, 20)
insert into #t values (1, 30)
insert into #t values (2, 5)
insert into #t values (2, 13)
insert into #t values (2, 25)
go
declare @time int select @time=11
-- This is the SQL I am asking about
select * from (select * from #t where ts <= @time) t group by id having ts = max(ts)
go
这条SQL的结果是
id ts
----------- -----------
1 10
2 5
这看起来像 HAVING 条件应用于行而不是组。有人可以指点我一个地方是描述这种情况的 Sybase 15.5 文档吗?我所看到的只是“HAVING 对组进行操作”。我在文档中看到的最接近的是:
having 子句可以包含不在其中的列或表达式 选择列表而不是 group by 子句。
(引用自here)。
但是,他们并没有准确解释当你这样做时会发生什么。
【问题讨论】:
-
您确定这是 Sybase 吗?我认为 Sybase 在
group by id上会失败,因为ts在select列表中但不在聚合中。这看起来更像 MySQL。 -
是的,这是 Sybase 15。Sybase 支持这一点 - 请参阅我提供的 Sybase 手册中的引文以结束问题。
-
这是一个较新的 Sybase 功能。在 MySQL 中,这将返回一行中的任意值。它不会做你所期望的。我很失望另一个数据库决定包含这个错误功能。
-
@Arkadiy,即使 sybase 支持它,使用此功能也是一个糟糕的主意,因为您不会总是得到您期望的结果,正如 mysql 人所发现的那样。未能完全指定 group by 子句是 SQL 反模式。不仅会出现问题,你会得到你想要的结果,而且更难维护。但我真的不确定你会期待什么其他结果。也许如果您告诉我们,我们可以为您指出将获得它的代码。
-
@HLGEM 我不期待另一个结果 - 我希望有人能指出我在 Sybase 文档中的一个地方,以保证这个结果不是偶然的。正如你所说,我可能不会得到我所期望的——除非 Sybase 在某处正式描述了这一点。