【发布时间】:2014-07-01 18:03:35
【问题描述】:
我有两张桌子,Alpha 和 Bravo。 Bravo 有一列 id(整数,主键)和其他一些与此问题无关的列。 Alpha 有列id(整数,主键),bravo_id(Bravo 表的外键),special(单个字符,对于大多数行为 null,但对于某些重要行具有值),created(日期时间),以及其他一些与此问题无关的内容。
我想从 Alpha 中获取所有特殊行,加上对于每个特殊行我想从 Alpha 中获取与同一行 Beta 相关联的“上一个”非特殊行(也就是说,我想获得具有相同bravo_id 的Alpha 行和比特殊行的created 更早的最新created),并且我需要保留特殊行及其上一行链接。
目前我正在使用 n+1 个查询来执行此操作:
SELECT id, bravo_id, created FROM Alpha WHERE special IS NOT NULL
对初始查询中的每个结果进行类似这样的查询:
SELECT id, created FROM Alpha
WHERE special IS NULL AND bravo_id = BrvN AND created < CrtN ORDER BY created DESC
显然这是非常低效的。有没有一种方法可以在单个查询中检索此信息,将每个特殊行及其前一个非特殊行放在结果的单行中?
我们的产品同时支持 SQL Server(如果相关,则为 2008 R2)和 Oracle(如果相关,则为 11g),因此适用于这两者的查询将是理想的,但只查询两者中的一个就可以了。
编辑:“创建”可能是用词不当。该列中的日期时间是创建引用对象的时间,而 不是 是它被输入数据库的时间(可能是几秒到几年后的任何时间)。基于 created 列的 Alpha 行排序与基于 id 列的排序(这是传统的递增标识/序列)几乎没有相关性。
【问题讨论】:
-
在 Oracle(或 SQL Server 2012)中,您可以使用
lag()函数从“上一个”行中获取值。
标签: sql sql-server oracle query-optimization