0

次の問題があります。

すべての場所の都市で最も早く来る従業員を選択し、場所の都市と来る日付を表示します

私は次のものを試しました

select  e.hiredate  as LOC,d.loc  as COMDATE
from    emp e, dept  d
where   e.hiredate in (
    select  min(e.hiredate) 
    from  emp e
    group by d.loc
)

次の結果を示します

17-DEC-80   NEW YORK
17-DEC-80   DALLAS
17-DEC-80   CHICAGO
17-DEC-80   BOSTON

しかし、問題は 17-DEC-80 が 1 つしかないことです。これは、それ自体が繰り返されることを意味します。どうすれば修正できますか?

4

3 に答える 3

1

結果は からの製品cross joinです。テーブル間の関係を提供する必要があります。元

SELECT  e.hiredate AS LOC,
        d.loc AS COMDATE
FROM    emp e
        INNER JOIN dept d 
            ON e.deptno = d.deptno
WHERE   e.hiredate IN 
        (
            SELECT min(e.hiredate)
            FROM emp e
            GROUP BY d.loc
        )
于 2013-02-05T15:05:34.513 に答える
1

雇用日/場所とともに他のフィールドを選択する必要がある場合は、rank()分析を使用できます。

select *
  from (select e.*, d.loc, rank() over (partition by d.loc order by e.hiredate) rnk
          from emp e
               inner join dept d
                       on d.deptno = e.deptno
       )
 where rnk = 1;

雇用日と場所だけが必要な場合は、使用してくださいmin()

select min(e.hiredate), d.loc
  from emp e
       inner join dept d
               on d.deptno = e.deptno
 group by d.loc;
于 2013-02-05T15:12:38.520 に答える
1

emp テーブルと dept テーブルを結合していないため、クエリにクロス結合またはデカルト積があります。JWによる最初のクエリのより単純なバージョン。そして、エイリアスは正しくありません...:

select  e.hiredate  as LOC,d.loc  as COMDATE
 from    scott.emp e, scott.dept  d
 where e.deptno= d.deptno -- Cartesian if you not join --
 and e.hiredate in (
     select  min(e.hiredate) 
      from  scott.emp e
      group by d.loc
   )
  /
于 2013-02-05T15:13:30.633 に答える