【问题标题】:Oracle filter by max dateOracle 按最大日期过滤
【发布时间】:2021-11-23 05:23:09
【问题描述】:

我正在寻找按 MAX 日期过滤表格的最佳方法。 在 where 中使用 select 查找会更好吗

 SELECT *
 FROM
     table1 foo
 WHERE
     foo.date_tmp = 
        (
            SELECT
                MAX (tmp.date_tmp ) 
            FROM
                table2 tmp 
            WHERE
                tmp.table_id = foo.id
        )

或者用 with 来实现

WITH tmp_max_date AS 
(
    SELECT
        tmp.table_id,
        MAX(date_tmp) date_tmp 
    FROM
        table2 tmp
    GROUP BY
        tmp.table_id
)
SELECT foo.*
FROM
    table1 foo
    INNER JOIN tmp_max_date tmd ON
        tmd.table_id = foo.id
        AND tmd.date_tmp = foo.date_tmp

有人知道最好的方法吗? IMO 这是第二个,但我不确定。

【问题讨论】:

  • 请显示示例数据(最好是 db fiddle 或其他可重现的示例)和预期输出。
  • 您当然可以根据自己的数据进行测试,看看哪个更好。您可能会发现没有区别(尽管在这种情况下可能有,而且您可能是正确的:第二种形式会更快)。您还可以将第二个版本编写为半连接 - IN 条件而不是实际连接。

标签: sql oracle date max sql-execution-plan


【解决方案1】:

可能是这样的:

select foo.id, 
max(foo.date_tmp) 
keep(dense_rank last order by foo.date_tmp) max_date_tmp
from table 1 foo, table 2 tmp
where foo.id = tmp.table_id
group by foo.id

【讨论】:

  • 这不等同于 OP 的查询,如果某些 id 的 max date_tmp 存在关联。 OP 的查询返回所有这些行;你的只返回一行。此外,OP 的查询返回所有列,而您的查询只返回三列。绝对不是“这个”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
相关资源
最近更新 更多