Oracle PL/SQL/Subquery/Virtual Table

Материал из SQL эксперт
Перейти к: навигация, поиск

First three rows from subquery

 
SQL>
SQL> create table history
  2  ( empno      NUMBER(4)
  3  , beginyear  NUMBER(4)
  4  , begindate  DATE
  5  , enddate    DATE
  6  , deptno     NUMBER(2)
  7  , sal        NUMBER(6,2)
  8  , comments   VARCHAR2(60)
  9  , constraint H_PK         primary key (empno,begindate)
 10  , constraint H_BEG_END    check       (begindate < enddate)
 11  ) ;
Table created.
SQL>
SQL>
SQL> alter session  set NLS_DATE_FORMAT="DD-MM-YYYY";
Session altered.
SQL>
SQL> insert into history values (1,2000,"01-02-2000", NULL       ,20, 800,"restarted");
1 row created.
SQL> insert into history values (2,1995,"01-10-1995","01-11-2009",30,1700,"");
1 row created.
SQL> insert into history values (2,2009,"01-11-2009", NULL       ,30,1600,"just hired");
1 row created.
SQL> insert into history values (3,1986,"01-10-1986","01-08-1987",20,1000,"");
1 row created.
SQL> insert into history values (3,1987,"01-08-1987","01-01-1989",30,1000,"On training");
1 row created.
SQL> insert into history values (3,2000,"01-02-2000", NULL       ,30,1250,"");
1 row created.
SQL>
SQL> select *
  2  from  (select empno, sal
  3         from   history
  4         order  by sal desc)
  5  where  rownum <= 3;
     EMPNO        SAL
---------- ----------
         2       1700
         2       1600
         3       1250
SQL>
SQL> drop table history;
Table dropped.
SQL>



Format result from subquery

 
SQL>
SQL>
SQL> select username,
  2         to_number( substr( data, 1, 10 ) ) cnt,
  3         to_number( substr( data, 11 ) ) avg
  4    from (
  5  select a.username, (select to_char( count(*), "fm0000000009" ) || avg(object_id) from all_objects b where b.owner = a.username) data
  6    from all_users a
  7         )
  8  /
USERNAME                              CNT        AVG
------------------------------ ---------- ----------
SYS                                  6520 5009.74064
SYSTEM                                422 6095.87678
OUTLN                                   7 1172.57143
DIP                                     0
TSMSYS                                  2     8606.5
INV15                                   2    16237.5
DBSNMP                                 46 9592.65217
INV10                                   2    16227.5
CTXSYS                                338 9877.92012
XDB                                   334 10800.7485
ANONYMOUS                               0
USERNAME                              CNT        AVG
------------------------------ ---------- ----------
MDSYS                                 458 11667.2009
HR                                     34    12104.5
FLOWS_FILES                            11 12717.2727
FLOWS_020100                         1085  12813.424
sqle                                530 16254.6849
INV11                                   2    16229.5
INV12                                   2    16231.5
INV13                                   2    16233.5
INV14                                   2    16235.5
PLSQL                                   0
INV16                                   2    16239.5
USERNAME                              CNT        AVG
------------------------------ ---------- ----------
INV17                                   2    16241.5
INV18                                   2    16243.5
INV19                                   2    16245.5
INV20                                   2    16247.5
DEFINER                                 4    16250.5
27 rows selected.
SQL>



Select from virtual table (sub query) with rownum

 

SQL>
SQL>
SQL> -- create demo table
SQL> create table Employee(
  2    ID                 VARCHAR2(4 BYTE)         NOT NULL,
  3    First_Name         VARCHAR2(10 BYTE),
  4    Last_Name          VARCHAR2(10 BYTE),
  5    Start_Date         DATE,
  6    End_Date           DATE,
  7    Salary             Number(8,2),
  8    City               VARCHAR2(10 BYTE),
  9    Description        VARCHAR2(15 BYTE)
 10  )
 11  /
Table created.
SQL>
SQL> -- prepare data
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2               values ("01","Jason",    "Martin",  to_date("19960725","YYYYMMDD"), to_date("20060725","YYYYMMDD"), 1234.56, "Toronto",  "Programmer")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2                values("02","Alison",   "Mathews", to_date("19760321","YYYYMMDD"), to_date("19860221","YYYYMMDD"), 2334.78, "Vancouver","Tester")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2                values("03","James",    "Smith",   to_date("19781212","YYYYMMDD"), to_date("19900315","YYYYMMDD"), 2334.78, "Vancouver","Tester")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2                values("04","Celia",    "Rice",    to_date("19821024","YYYYMMDD"), to_date("19990421","YYYYMMDD"), 2334.78, "Vancouver","Manager")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary,  City,       Description)
  2                values("05","Robert",   "Black",   to_date("19840115","YYYYMMDD"), to_date("19980808","YYYYMMDD"), 2334.78, "Vancouver","Tester")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary, City,        Description)
  2                values("06","Linda",    "Green",   to_date("19870730","YYYYMMDD"), to_date("19960104","YYYYMMDD"), 2334.78,"New York",  "Tester")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary, City,        Description)
  2                values("07","David",    "Larry",   to_date("19901231","YYYYMMDD"), to_date("19980212","YYYYMMDD"), 2334.78,"New York",  "Manager")
  3  /
1 row created.
SQL> insert into Employee(ID,  First_Name, Last_Name, Start_Date,                     End_Date,                       Salary, City,        Description)
  2                values("08","James",    "Cat",     to_date("19960917","YYYYMMDD"), to_date("20020415","YYYYMMDD"), 2334.78,"Vancouver", "Tester")
  3  /
1 row created.
SQL>
SQL>
SQL>
SQL> -- display data in the table
SQL> select * from Employee
  2  /
ID   FIRST_NAME LAST_NAME  START_DAT END_DATE      SALARY CITY       DESCRIPTION
---- ---------- ---------- --------- --------- ---------- ---------- ---------------
01   Jason      Martin     25-JUL-96 25-JUL-06    1234.56 Toronto    Programmer
02   Alison     Mathews    21-MAR-76 21-FEB-86    2334.78 Vancouver  Tester
03   James      Smith      12-DEC-78 15-MAR-90    2334.78 Vancouver  Tester
04   Celia      Rice       24-OCT-82 21-APR-99    2334.78 Vancouver  Manager
05   Robert     Black      15-JAN-84 08-AUG-98    2334.78 Vancouver  Tester
06   Linda      Green      30-JUL-87 04-JAN-96    2334.78 New York   Tester
07   David      Larry      31-DEC-90 12-FEB-98    2334.78 New York   Manager
08   James      Cat        17-SEP-96 15-APR-02    2334.78 Vancouver  Tester
8 rows selected.
SQL>
SQL> -- select from virtual table
SQL>
SQL>
SQL> SELECT id "Emp #", first_name "Name", salary "Salary",
  2    ROWNUM rank
  3  FROM
  4    (SELECT id, first_name, salary FROM employee ORDER BY salary desc);
Emp  Name           Salary       RANK
---- ---------- ---------- ----------
04   Celia         2334.78          1
02   Alison        2334.78          2
03   James         2334.78          3
08   James         2334.78          4
05   Robert        2334.78          5
06   Linda         2334.78          6
07   David         2334.78          7
01   Jason         1234.56          8
8 rows selected.
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL>
SQL> -- clean the table
SQL> drop table Employee;
Table dropped.
SQL>
SQL>