2

这是中的数据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。

4

3 回答 3

1

SQLFiddle 演示

select * from Foo
LEFT JOIN
(
  SELECT  BAR.*,
          ROW_NUMBER() 
          OVER (PARTITION BY FooID 
                ORDER BY StartDate) as RowNumber
   FROM BAR 
 ) Bar2 on (Foo.id=Bar2.FooId) and (Bar2.RowNumber=1)
于 2013-11-13T12:53:45.447 回答
1

我不太确定你想在这里做什么,但我认为你不能加入 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

它首先按 startdate 对 bar 中的条目进行排名,然后通过 id 加入。在它之外只选择排名第一的候选人(最早开始日期)

于 2013-11-13T12:43:24.707 回答
1

尝试这个:

SELECT NAME
FROM foo b
LEFT JOIN (
  SELECT FooID,MIN(StartDate)
  FROM bar
  GROUP BY FooID
  ) MyBar
  ON MyBar.FooId = b.ID

sqlfiddle demo

这将为每个 FooId 加入 MIN(startDate)。

如果您在查询中包含日期,它将导致:

NAME   FOODATE
Car    January, 01 2011 00:00:00+0000
Bus    April, 01 2011 00:00:00+0000
于 2013-11-13T12:46:59.877 回答