bugfix> sql > 投稿

次の質問に答えようとしています。 ID_Numberと、最低賃金の5人の従業員の名前を表示します。

これは従業員のテーブルです:

CREATE TABLE Employees
    (ID_No          CHAR(4)     NOT NULL,
     Name           VARCHAR(50) NOT NULL,
     Hire_Date      DATE        NOT NULL,
     Position       VARCHAR(20) CHECK(Position IN('CHAIRMAN','MANAGER','ANALYST','DESIGNER','PROGRAMMER','SALES REP','ADMIN','ACCOUNTANT')),
     Salary         NUMERIC(8,2)    NOT NULL,
     Mgr_ID_No      CHAR(4)     NULL,
     Dept_No        SMALLINT    NULL);

いくつかの方法を試してきましたが、「limit」と「top」が何らかの理由で機能しないことを付け加えます。

回答 4 件
  • Oracle 12c :

    -- more than 5 rows being returned, if multiple rows 
    -- match the value of the 5th row
    SELECT e.ID_No, e.Name
      FROM Employees e
     ORDER BY e.Salary  
     FETCH FIRST 5 ROWS WITH TIES;
    -- only 5 rows being returned, even if multiple rows 
    -- match the value of the 5th row
    SELECT e.ID_No, e.Name
      FROM Employees e
     ORDER BY e.Salary  
     FETCH FIRST 5 ROWS ONLY; 
    -- NEXT clause may be replaced with FIRST  
    SELECT e.ID_No, e.Name
      FROM Employees e
     ORDER BY e.Salary 
     FETCH NEXT 5 ROWS ONLY;
    
    

    先立ってOracle 12c :

    SELECT e.ID_No, e.Name
      FROM ( SELECT ID_No, Name, row_number() over (order by salary) seq FROM Employees ) e
     WHERE e.seq <= 5
     ORDER BY e.seq;
    
    

    クエリは上位Nクエリ

  • SELECT ID_NO, NAME
    FROM EMPLOYEES
    ORDER BY SALARY
    FETCH FIRST 5 ROWS ONLY
    
    

  • row_number()ウィンドウ関数はここで動作するはずです(ウィンドウ関数はWHERE/HAVING句では使用できないことに注意してください)。

    SELECT ID_No, Name
    FROM (SELECT ID_No, Name, Row_Number() OVER (ORDER BY Salary) RN
      FROM Employees)
    WHERE RN <= 5;
    
    

  • Oracle ROWNUM で  使用することができます。

    SELECT *
           FROM (SELECT ID_No,
                        Name
                        FROM Employees
                        ORDER BY Salary) x
           WHERE ROWNUM <= 5;
    
    

    別の方法は、給与が低いか等しい行をカウントするサブクエリです。

    SELECT EO.ID_No,
           EO.Name
           FROM Employees EO
           WHERE (SELECT COUNT(*)
                         FROM Emplyoees EI
                         WHERE EI.Salary <= EO.Salary) <= 5;
    
    

あなたの答え