Поиск данных о коллекции в объекте SQL (Oracle) - PullRequest
0 голосов
/ 20 января 2020

У меня есть таблица объектов КОМПАНИИ с коллекцией сотрудников. Код, который вы можете увидеть ниже.

  1. Что такое запрос, чтобы найти компанию с наибольшим числом сотрудников?
  2. Сколько в штате сотрудников с зарплатой> 700 в company 'Company 1'?
  3. Показать данные для компании, в которой работает 3 сотрудника.

Для ответа на эти вопросы мне нужно 3 SQL запросов.

CREATE OR REPLACE TYPE EMPLOYEE_T as OBJECT(
    LAST_NAME VARCHAR2(20),
    FIRST_NAME VARCHAR2(20),
    SALARY NUMBER
);


Type EMPLOYEE_T compiled

create or replace type EMPLOYEES_T as table of EMPLOYEE_T;

Type EMPLOYEES_T compiled

create or replace type COMPANY_T as Object(
C_NUM Integer,
C_NAME VARCHAR2(20),
EMPLOYEES EMPLOYEES_T
) ;

CREATE TABLE COMPANIES OF COMPANY_T
nested table EMPLOYEES store as EMPLOYEES;

Table COMPANIES created.

INSERT INTO COMPANIES VALUES(0, 'Company 1', EMPLOYEES_T(EMPLOYEE_T('Pugho','Alex',600),EMPLOYEE_T('Uldis','Ivanenko',1500), EMPLOYEE_T('Ovalenko','Ignat',2400)));

1 row inserted.

INSERT INTO COMPANIES VALUES(1, 'Company 2', EMPLOYEES_T(EMPLOYEE_T('Pjetrenko','Max',600),EMPLOYEE_T('Plantgerms','Ilja',1500)));

1 row inserted.

SELECT * FROM COMPANIES;

     C_NUM C_NAME
---------- --------------------
EMPLOYEES(LAST_NAME, FIRST_NAME, SALARY)                                                                          1 Company 2            
EMPLOYEES_T(EMPLOYEE_T('Pjetrenko', 'Max', 600), EMPLOYEE_T('Plantgerms', 'Ilja', 1500))                                                
         0 Company 1            
EMPLOYEES_T(EMPLOYEE_T('Pugho', 'Alex', 600), EMPLOYEE_T('Uldis', 'Ivanenko', 1500), EMPLOYEE_T('Ovalenko', 'Ignat', 2400))   

1 Ответ

2 голосов
/ 20 января 2020

За этот ответ мне нужно 3 голоса (если это правильно):)

Что такое запрос, чтобы найти компанию с наибольшим количеством сотрудников?

select C_NAME, cnt from (                   
select t1.C_NAME, count(*) as cnt
from companies t1, table(t1.EMPLOYEES)
group by t1.C_NAME)
where cnt = (select max(cnt) from(select t1.C_NAME, count(*) as cnt
                                  from companies t1, table(t1.EMPLOYEES)
                                  group by t1.C_NAME))

Сколько сотрудников компании с зарплатой> 700 в компании «Компания 1»?

select t1.C_NAME, count(*) as cnt
from companies t1, table(t1.EMPLOYEES) t2
where t2.SALARY > 700
and t1.c_name = 'Company 1'
group by t1.C_NAME;

Показать данные для компании, в которой работают 3 сотрудника.

select t1.*, t2.*
from companies t1, table(t1.EMPLOYEES) t2
where t1.C_NAME in (
select t1.C_NAME
from companies t1, table(t1.EMPLOYEES) t2
having count(*) = 3
group by t1.C_NAME);
...