【问题标题】:Finding rows younger/older than a specific row without subquery在没有子查询的情况下查找比特定行更年轻/更老的行
【发布时间】:2021-03-15 00:03:21
【问题描述】:
我有一张表cats,列有id 和birthday。 id 不保证代表底层数据的时间顺序。
在这个模式设置中,如果我们想找到比给定猫更年轻/更年长的猫,我们可以使用子查询构造查询:
SELECT * FROM cats WHERE created_at < (SELECT created_at FROM cats WHERE id = ? LIMIT 1)
但我想知道是否有更有效的方法来进行此查询。这是专门针对 Postgres 的,但我很好奇答案是否可能与其他数据库引擎不同。
谢谢,
【问题讨论】:
标签:
sql
postgresql
datetime
subquery
where-clause
【解决方案1】:
您的查询看起来不错,应该是解决问题的有效方法。子查询中的 limit 子句是多余的,前提是 id 是唯一列。
另一种方法是自联接:
select c.*
from cats c
inner join cats c1 on c.created_at < c1.created_at
where c1.id = ?
或者你可以使用窗口函数:
select *
from (
select c.*,
min(created_at) filter(where id = ?) over() created_at1
from cats c
) c
where created_at < created_at1
【解决方案2】:
这个查询:
SELECT c.*
FROM cats c
WHERE c.created_at < (SELECT c2.created_at FROM cats c2 WHERE id = ? LIMIT 1);
使用cats(id, created_at) 上的索引应该非常有效。请注意,LIMIT 不是必需的。
这将扫描cats 表并使用索引快速查找子查询。很难想出一种更快的方式来运行查询。