当前位置: 首页 > 面试题库 >

Sybase:是否对行进行操作?

娄嘉石
2023-03-14
问题内容

我遇到了以下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文档吗?我所看到的只是“在团队中运作”。我在文档中看到的最接近的是:

hading子句可以包括不在选择列表中且不在group by子句中的列或表达式。

(从这里引用)。

但是,他们没有完全解释当您这样做时会发生什么。


问题答案:

我的理解:是的,从根本上说,HAVING在行上进行操作。通过省略GROUP
BY,它可以对单个“超组”中的所有结果行进行操作,而不是对组内行进行操作。请阅读原始链接的Sybase docco中的
“分组方式以及如何使用聚合进行查询” 一节:

如何对汇总进行分组并进行查询

  • 这里 子句排除不符合其搜索条件的行; 对于分组查询或非分组查询,其功能保持不变。
  • 对于 group by 表达式中的每个唯一值, group by 子句将剩余的行收集到一组中。省略 group
    by
    将为整个表创建单个组。
  • 在选择列表中指定的集合函数计算每个组的摘要值。对于标量聚合,表只有一个值。向量集合可计算不同组的值。
  • 条款中排除组从那些不符合其搜索条件的结果。即使 having 子句仅测试行,但 group by
    子句的存在或不存在可能会使它似乎在组上运行:
    • 当查询包括 group by时 排除结果组行。这就是为什么 好像在团体开展工作。
    • 如果查询没有 分组依据 ,则查询结果将从(单组)表 排除。这就是为什么 似乎对行进行操作(的结果是相似的
      ,其中 条款的结果)。

其次,在“ having,group
by和where子句如何相互作用”部分中有一个简短的摘要:

具有,分组依据和where子句如何相互作用

当在查询中包含 havinggroup bywhere 子句时,每个子句影响行的顺序将确定最终结果:

  • 这里 子句排除不符合其搜索条件的行。
  • 对于 group by 表达式中的每个唯一值, group by 子句将剩余的行收集到一组中。
  • 在选择列表中指定的集合函数计算每个组的摘要值。
  • 从那些不符合其搜索条件的最终结果子句排除行。

@SQLGuru的解释就是对此的说明。

编辑…

与此相关的是,我对使用TSQL“扩展列”的不符合ANSI的查询的行为感到惊讶。Sybase处理 (i) WHERE子句之后的扩展列 ii)
通过创建到原始表的额外联接,以及 (iii)
联接中未使用WHERE子句。这样的查询可能返回比预期更多的行,并且HAVING子句随后需要附加条件才能将其过滤掉。

请参阅原始链接的docco页面上的 “用于分组并具有的Transact-SQL扩展” 下的示例 b c
d
。我发现从Sybase安装 pubs2 示例数据库与示例一起使用非常有用。



 类似资料:
  • 我正在编写一个带有事务回滚的简单json数据库。我需要向一个文件追加一行文本,然后根据追加是否成功,将成功或失败记录到另一个文件。如果需要,第二个文件用于回滚。因此,在继续之前,我需要确定写操作是否成功。 我使用stream.write追加我的文本行,其中包括一个回调,应该验证写操作的成功或失败。 然后我在下面的URL上的NodeJS文档中读到了这个不幸的消息https://nodejs.org/

  • 我想测试一个返回流的方法。 现在,我已经为当somecondition=true时的情况编写了以下测试

  • 问题内容: [ 我正在编写自动生成HTML的代码,并且希望它对事物进行正确编码。 假设我正在生成指向以下URL的链接: 我假设所有属性值都应进行HTML编码。(如果我写错了,请纠正我。)因此,这意味着如果将上述URL放入锚标记中,则应将&编码为,如下所示: 那是对的吗? ]() 问题答案: [ 是的。HTML实体在HTML属性中进行了解析,并且流浪会造成歧义。这就是为什么您应该始终编写而不是仅在

  • 我有一个spark数据帧,如: 以 如何构造一个在列上运行的UDF,即由火花创建的包装数组,以计算变量平均值?

  • 问题内容: 我想知道单个文件的写入是否原子完成,从而对同一文件的write(“ bla bla”)和随后的write(“ herp derp”)永远不会导致交织,例如“ bla herp bla derp ”。假设这些写操作发生在不同的进程或线程中,什么决定了哪个先完成? 另外,read()是否始终以完全完成的所有先前写入的状态返回反映文件的数据(无论该数据实际上是否已写入磁盘)?例如,在writ

  • 这是我的代码(简单但有效),它是一个计算引擎,通过按特定顺序应用规则进行试验: 我想用自定义注释对此进行编码,因为我的目标是统计哪些引擎调用哪些规则,我认为这会更容易: 然后我可以用org扫描。springframework。上下文注释。ClassPathScanningCandidateCom使统计更容易。 这可能吗(怎么可能?)?这是好办法吗?我还有别的办法吗?