sql - JOIN/GROUP 选择最早

标签 sql oracle

这是Bar中的数据:

ID     FooID    StartDate
1        1         1-1-2011
2        1         2-1-2011
3        1         3-1-2011
4        2         9-1-2011
5        2         4-1-2011

这是表Foo:

ID   Name
1        Car
2        Bus  

我需要LEFT JOIN最早出现的FROM Foo

这就是我现在拥有的:

SELECT NAME
FROM Foo
LEFT JOIN (
  SELECT *
  FROM Bar
  WHERE Bar.FooID = Foo.ID
  ORDER BY Bar.StartDate
  ) MyBar
  ON (ROWNUM = 1)

但是出现了 ORA-00923。

最佳答案

我不太确定你想在这里做什么,但我认为你不能加入 rownum 也不能从内部选择中寻址 foo.id 。我可以给你这个方法,我认为它应该可以解决问题:

select name
  from foo
  left join (
              select bar.*
                   , dense_rank() over (order by bar.startdate) as cand
                from bar
            ) mybar
    on (mybar.fooid = foo.id)
 where mybar.cand = 1

它首先按开始日期对 bar 中的条目进行排名,然后通过 id 进行连接。外部仅选择排名 1 的候选者(最早开始日期)

关于sql - JOIN/GROUP 选择最早,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19953944/

相关文章:

oracle - 如何在 docker 容器内的 Oracle 数据库上使用 sqlldr?

r - 通过R中的ROracle从Oracle查询获取正确的日期时间

sql - 执行非常复杂的 SQL 分组的有效方法 :

php - 用户间信用转移的Mysql事务

java - hibernate oracle 标识符太长 ORA-00972

c# - 在 GridView 中对 DropDownList 选定值使用 Eval

java - 无效的列索引错误oracle db java

java - Hibernate - 与 2 @OneToMany 一起崩溃

mysql - 超过 1 个表的 SQL 内连接问题

mysql - 使用许多连接优化 SQL 查询