【发布时间】:2015-07-26 06:02:37
【问题描述】:
平台:Oracle 10g
我有一张这样的桌子(我们称之为t1):
对于每个FK_ID,我希望显示一个结果,显示两个最近的SOME_VALUEs。那就是:
FK_ID 有另一个表(我们称之为t2),这里有一个参考
说这是“当前”记录。所以像这样的表:
我正在尝试使用 有缺陷的子查询连接,如下所示:
SELECT id, curr.some_value as current, prev.some_value as previous FROM t2
JOIN t1 curr ON t2.fk_current = t1.id
JOIN t1 prev ON t1.id = (
SELECT * FROM (
SELECT id FROM (
SELECT id, ROW_NUMBER() OVER (ORDER BY SOME_DATE DESC) as rno FROM t1
WHERE t1.fk_id = t2.id
) WHERE rno = 2
)
)
但是t1.fk_id = t2.id 有缺陷(即不会运行),因为(我现在知道)你不能通过父母
字段值到子查询的深度超过一级。
然后我开始想知道公用表表达式 (CTE) 是否是此工具,但后来我没有 使用这些的经验(所以想知道我没有走错路尝试使用它们 - 如果那是工具的话)。
所以我想让我绊倒的关键复杂性是:
- 通过排序确定前一个值,但同时将其限制为第一条记录(而不是整个表)。 (因此有些复杂的子查询尝试。)
否则,我可以编写一些代码来首先执行查询以获取“当前”值,然后 执行第二个查询以获取“上一个” - 但我很想知道如何用一个单一的来解决这个问题 SQL 查询,因为这似乎是一件很常见的事情(当然是我需要工作的数据库) 与)。
谢谢!
【问题讨论】: