【问题标题】:Finding rows younger/older than a specific row without subquery在没有子查询的情况下查找比特定行更年轻/更老的行
【发布时间】:2021-03-15 00:03:21
【问题描述】:

我有一张表cats,列有idbirthdayid 不保证代表底层数据的时间顺序。

在这个模式设置中,如果我们想找到比给定猫更年轻/更年长的猫,我们可以使用子查询构造查询:

SELECT * FROM cats WHERE created_at < (SELECT created_at FROM cats WHERE id = ? LIMIT 1)

但我想知道是否有更有效的方法来进行此查询。这是专门针对 Postgres 的,但我很好奇答案是否可能与其他数据库引擎不同。

谢谢,

【问题讨论】:

  • IMO 这是最有效的方式(假设两列都被索引)

标签: 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 表并使用索引快速查找子查询。很难想出一种更快的方式来运行查询。

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 2021-03-08
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 2020-03-13
      • 1970-01-01
      • 2018-06-27
      相关资源
      最近更新 更多