Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Main_Table PK User_Constraints 3 страница

CURRENT_YEAR MON TUE WED THU FRI SAT SUN | Z23456789 123456789 123456789 123456789 80 symbols | Main_Table PK User_Constraints 1 страница | Main_Table PK User_Constraints 5 страница | Main_Table PK User_Constraints 6 страница | Main_Table PK User_Constraints 7 страница | Main_Table PK User_Constraints 8 страница | Main_Table PK User_Constraints 9 страница | Main_Table PK User_Constraints 10 страница | Main_Table PK User_Constraints 11 страница |


Читайте также:
  1. 1 страница
  2. 1 страница
  3. 1 страница
  4. 1 страница
  5. 1 страница
  6. 1 страница
  7. 1 страница

SELECT rownum emp_num, emp_num_in_dept,

CASE WHEN emp_num_in_dept = 1 THEN department_id

ELSE NULL

END deptno, job_id, last_name, salary, dept_salary_rank

FROM (

SELECT emp_num_in_dept, department_id, job_id, last_name, salary, dept_salary_rank

FROM (SELECT row_number() OVER(PARTITION BY department_id ORDER BY salary DESC) emp_num_in_dept,

department_id,job_id, last_name, salary,

DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) dept_salary_rank

FROM employees

WHERE department_id IN ('10', '30', '50', '90'))

ORDER BY department_id ASC, salary DESC, last_name ASC);

Результат:

 

EMP_NUM EMP_NUM_IN_DEPT DEPTNO JOB_ID LAST_NAME SALARY DEPT_SALARY_RANK

---------------------- ---------------------- ---------------------- ---------- ------------------------- ---------------------- ----------------------

1 1 10 AD_ASST Whalen 4400 1

2 1 30 PU_MAN Raphaely 11000 1

3 2 PU_CLERK Khoo 3100 2

4 3 PU_CLERK Baida 2900 3

5 4 PU_CLERK Tobias 2800 4

6 5 PU_CLERK Himuro 2600 5

7 6 PU_CLERK Colmenares 2500 6

8 1 50 ST_MAN Fripp 8200 1

9 2 ST_MAN Weiss 8000 2

10 3 ST_MAN Kaufling 7900 3

11 4 ST_MAN Vollman 6500 4

12 5 ST_MAN Mourgos 5800 5

13 6 SH_CLERK Sarchand 4200 6

14 7 SH_CLERK Bull 4100 7

55 rows selected

 

Комментарий:

В подзапросе нумеруем сотрудников внутри каждого отдела, ранжируем сотрудников по зарплатам внутри отдела. Выбираем только нужные нам отделы. Затем сортируем результат. В основном запросе делаем нумерацию (организовали сквозную нумерацию). Заменяем все номера отделов у сотрудников на NULL, кроме первого сотрудника в каждом отделе.

 

5. Выбрать информацию о сотрудниках компании, непосредственные руководители которых работают в офисе, расположенном в другой стране, нежели офис, где работает сотрудник.

В результат вывести: Идентификатор сотрудника; Фамилию сотрудника; Название страны, где расположен офис сотрудника; Идентификатор непосредственного руководителя сотрудника; Фамилию непосредственного руководителя сотрудника; Название страны, где расположен офис непосредственного руководителя сотрудника.

Результат отсортировать по возрастанию по полям: название страны, где расположен офис сотрудника; фамилия сотрудника.

 

SELECT tab.employee_id,tab.last_name,tab.country_name,em AS "Manager_id",ln AS "Last_name mngr",countries.country_name as "Mngr counrty_name"

FROM

(SELECT t.employee_id,t.last_name,t.department_id,country_name,em,ln,di

FROM

(SELECT e1.employee_id,e1.last_name,e1.department_id,e2.employee_id em,e2.last_name ln,e2.department_id di

FROM employees e1 INNER JOIN employees e2

ON e1.manager_id = e2.employee_id) t

JOIN departments ON t.department_id = departments.department_id

JOIN locations ON departments.location_id = locations.location_id

JOIN countries ON locations.country_id = countries.country_id) tab

JOIN departments ON tab.di = departments.department_id

JOIN locations ON departments.location_id = locations.location_id

JOIN countries ON locations.country_id = countries.country_id

WHERE tab.country_name!= countries.country_name

ORDER BY tab.country_name, tab.last_name;

 

Комментарий:

Соединяем таблицу саму с собой, чтобы связать сотрудника с его менеджером. Соединяем полученную таблицу с таблицами departments, locations, countries, чтобы узнать страну, в которой находится офис сотрудника. Затем соединяем еще раз с таблицами departments, locations, countries, чтобы выяснить, в какой стране находится офис начальника. Выбираем те строки, в которых страны не совпадают. Сортируем результат.

 

6. Для каждого сотрудника, имеющего оклад выше среднего в том подразделении компании, к которому он приписан, отобразить всех сотрудников того же подразделения, имеющих оклад, больше чем у данного сотрудника.

Вывести данные для подразделений компании с идентификаторами 60 и 80.

Результат команды SELECT должен содержать следующие столбцы: Фамилия данного сотрудника; Оклад данного сотрудника; Фамилия сотрудника, с большим окладом; Оклад сотрудника, с большим окладом; Идентификатор подразделения компании; Средний оклад по данному подразделению компании (округлить до 2-х знаков после запятой).

Данные результата должны быть упорядочены по возрастанию по идентификатору подразделения; окладу данного сотрудника; фамилии данного сотрудника; окладу сотрудника с окладом большим, чем у данного; фамилии сотрудника с окладом большим, чем у данного.

 

SELECT tab1.last_name, tab1.salary, e.last_name last_name_big,

e.salary salary_big, tab1.department_id departament, tab1.avgsalary avg_dep

FROM

(SELECT last_name, salary,department_id, avgsalary

FROM (SELECT last_name, salary,department_id, round(avg(salary) over (partition by department_id),2) avgsalary

FROM employees)

WHERE salary > avgsalary) tab1

INNER JOIN employees e

ON tab1.department_id = e.department_id AND tab1.salary < e.salary

WHERE tab1.department_id in ('60', '80')

ORDER BY tab1.department_id,tab1.salary, tab1.last_name, e.salary, e.last_name;

 

LAST_NAME SALARY LAST_NAME_BIG SALARY_BIG DEPARTAMENT AVG_DEP

------------------------- ---------------------- ------------------------- ---------------------- ---------------------- ----------------------

Ernst 6000 Hunold 9000 60 5760

Hall 9000 Bernstein 9500 80 8955,88

Hall 9000 Greene 9500 80 8955,88

Hall 9000 Sully 9500 80 8955,88

Hall 9000 Fox 9600 80 8955,88

Hall 9000 Bloom 10000 80 8955,88

Hall 9000 King 10000 80 8955,88

Hall 9000 Tucker 10000 80 8955,88

Hall 9000 Vishney 10500 80 8955,88

Hall 9000 Zlotkey 10500 80 8955,88

Hall 9000 Abel 11000 80 8955,88

Hall 9000 Cambrault 11000 80 8955,88

Hall 9000 Ozer 11500 80 8955,88

Hall 9000 Errazuriz 12000 80 8955,88

Hall 9000 Partners 13500 80 8955,88

Hall 9000 Russell 14000 80 8955,88

McEwen 9000 Bernstein 9500 80 8955,88

 

128 rows selected

 

Комментарий:

В подзапросе выбираем сотрудников, зарплата которых выше средней зарплаты в отделе, в котором они работают. Соединяем таблицу employeеs и выборку, полученную в подзапросе, чтобы отобрать всех сотрудников, зарплата которых больше, чем заплата сотрудников из выборки. Отбираем только нужные нам отделы 60 и 80. Результат сортируем.

 

7. Проверить каждый столбец таблицы Employees на уникальность значений и вывести все строки таблицы, в которых хотя бы в одном столбце встречается значение атрибута, которое в этом столбце не уникально (встречается несколько раз).

 

SELECT DISTINCT e.employee_id, e.last_name, e.first_name, e.email, e.phone_number,

e.hire_date, e.job_id, e.salary, e.commission_pct, e.manager_id, e.department_id

FROM employees e CROSS JOIN employees d

WHERE (e.first_name = d.first_name AND e.employee_id!= d.employee_id)

OR (e.last_name = d.last_name AND e.employee_id!= d.employee_id)

OR (e.email = d.email AND e.employee_id!= d.employee_id)

OR (e.phone_number = d.phone_number AND e.employee_id!= d.employee_id)

OR (e.hire_date = d.hire_date AND e.employee_id!= d.employee_id)

OR (e.job_id = d.job_id AND e.employee_id!= d.employee_id)

OR (e.salary = d.salary AND e.employee_id!= d.employee_id)

OR (e.commission_pct = d.commission_pct AND e.employee_id!= d.employee_id)

OR (e.manager_id = d.manager_id AND e.employee_id!= d.employee_id)

OR (e.department_id = d.department_id AND e.employee_id!= d.employee_id)

ORDER BY e.employee_id;

 

Комментарий:

Соединяем таблицу employees саму с собой и сравниваем значение определенного столбца первой таблицы employees со значениями второй таблицы employees. Если id сотрудников разные, а значения в проверяемом столбце одинаковые, то значит значение в столбце не уникально. Затем делаем выборку только по первой таблице и сортируем результат.

 

Если считать 2 строки с пустыми значениями в одном столбце неуникальными:

SELECT *

FROM employees

WHERE first_name = ANY(SELECT first_name

FROM (SELECT first_name, COUNT(*) cnt FROM employees GROUP BY first_name)

WHERE cnt >1)

OR last_name = ANY(SELECT last_name

FROM (SELECT last_name, COUNT(*)cnt FROM employees GROUP BY last_name)

WHERE cnt >1)

OR email = ANY (SELECT email

FROM (SELECT email, COUNT (*) cnt FROM employees GROUP BY email)

WHERE cnt >1)

OR phone_number = ANY (SELECT phone_number

FROM (SELECT phone_number, COUNT (*) cnt FROM employees GROUP BY phone_number)

WHERE cnt >1)

OR hire_date = ANY (SELECT hire_date

FROM (SELECT hire_date, COUNT (*) cnt FROM employees GROUP BY hire_date)

WHERE cnt >1)

OR job_id = ANY (SELECT job_id

FROM (SELECT job_id, COUNT (*) cnt FROM employees GROUP BY job_id)

WHERE cnt >1)

OR salary = ANY (SELECT salary

FROM (SELECT salary, COUNT (*) cnt from employees GROUP BY salary)

WHERE cnt >1)

OR commission_pct = ANY (SELECT commission_pct

FROM (SELECT commission_pct, COUNT (*) cnt FROM employees GROUP BY commission_pct)

WHERE cnt >1)

OR manager_id = ANY (SELECT manager_id

FROM (SELECT manager_id, COUNT (*) cnt FROM employees GROUP BY manager_id)

WHERE cnt >1)

OR department_id = ANY (SELECT department_id

FROM (SELECT department_id, COUNT (*) cnt FROM employees GROUP BY department_id)

WHERE cnt >1);

 

Комментарий:

Для каждого столбца проверяем значения на уникальность, для этого считаем количество каждого уникального атрибута cnt. Выбираем те строки, в которых это значение больше единицы.

107 rows selected

 

8. Создать запрос для построения иерархии объектов "Специальность - Группа - Фамилия" для тех специальностей и групп, в которых есть студенты.

В результате вывести:

· номер уровня, на котором находится в иерархии данный объект,

· имя объекта, дополненное слева (LEVEL -1)*3 пробелами.

Объекты одного уровня должны быть отсортированы по именам.

 

Пример результата:

Уровень Иерархия

1 Системы автоматического управления

2 121

3 Поляков А.Л.

3 Старова Н.Л.

 

SELECT LEVEL "Уровень", lpad(name_spec,length(name_spec) + (LEVEL-1)*3, ' ') "Иерархия"

FROM

(

SELECT name_spec, nam_sp

FROM (SELECT специальности.название_специальности name_spec

FROM студенты INNER JOIN группы

ON студенты.номер_группы = группы.номер_группы

INNER JOIN специальности

ON специальности.код_специальности = группы.код_специальности

UNION

SELECT студенты.номер_группы

FROM студенты INNER JOIN группы

ON студенты.номер_группы = группы.номер_группы

INNER JOIN специальности

ON специальности.код_специальности = группы.код_специальности

UNION

SELECT студенты.фамилия

FROM студенты INNER JOIN группы

ON студенты.номер_группы = группы.номер_группы

INNER JOIN специальности

ON специальности.код_специальности = группы.код_специальности) t1

LEFT JOIN

(SELECT группы.номер_группы, название_специальности nam_sp

FROM группы INNER JOIN специальности

ON группы.код_специальности = специальности.код_специальности

UNION

SELECT фамилия, студенты.номер_группы

FROM студенты) t2

ON t1.name_spec = t2.номер_группы)

START WITH nam_sp IS NULL

CONNECT BY PRIOR name_spec = nam_sp

ORDER SIBLINGS BY name_spec;

 

Результат:

Уровень Иерархия

----------------------

1 СИСТЕМЫ АВТОМАТИЧЕСКОГО УПРАВЛЕНИЯ

2 121

3 Гриценко

3 Поляков

3 Старова

2 122

3 Котенко

3 Нагорный

1 ЭКОНОМИКА ПРЕДПРИЯТИЙ

2 123

3 Усов

3 Устинов

2 124

3 Ежов

3 Улиткин

 

15 rows selected

 

Комментарий:

Объединяем специальности, группы студентов, фамилии студентов в одну колонку для дальнейшей иерархии. Добавляем дополнительную колонку, в которой содержится названия специальностей и номера групп, для того чтобы понять подчиненность в дереве. Строим иерархию с помощью псевдостолбца level и нумеруем уровни. Сортируем результат.

 

9. Выбрать сотрудников, имеющих оклад равный минимальному окладу сотрудников отдела, к которому они приписаны. Исключить из выборки сотрудников, которые не приписаны ни к какому отделу.

В результат вывести: Идентификатор сотрудника, Фамилию сотрудника, Оклад, установленный сотруднику, Идентификатор подразделения, к которому приписан сотрудник.

Результат отсортировать по возрастанию по полям: идентификатор подразделения, к которому приписан сотрудник; оклад, установленный сотруднику; фамилия сотрудника.

 

 

SELECT employee_id, last_name, salary, department_id

FROM employees

WHERE (department_id, salary) IN

(SELECT department_id, MIN(salary)

FROM employees

WHERE department_id IS NOT NULL

GROUP BY department_id)

ORDER BY department_id, salary, last_name;

 

Результат:

 

EMPLOYEE_ID LAST_NAME SALARY DEPARTMENT_ID

---------------------- ------------------------- ---------------------- ----------------------

200 Whalen 4400 10

202 Fay 6000 20

119 Colmenares 2500 30

203 Mavris 6500 40

132 Olson 2100 50

107 Lorentz 4200 60

204 Baer 10000 70

173 Kumar 6100 80

102 De Haan 17000 90

101 Kochhar 17000 90

113 Popp 6900 100

206 Gietz 8300 110

 

12 rows selected

 

Комментарий:

Выбираем в каждом подразделении наименьшую зарплату и отсекаем тех сотрудников, которые не приписаны ни к какому отделу. Затем выбираем сотрудников, у которых номер департамента и зарплата совпадает со значениями из подзапроса, чтобы найти только тех сотрудников, зарплата которых в своем отделе равна минимальной.

 

10. Создать запрос для определения количества сотрудников в каждом отделе, которые никем не руководят. В результат вывести:

· столбец 1: идентификатор подразделения компании, к которому приписан сотрудник,

· столбец 2: количество сотрудников подразделения, которые никем не руководят.

В последней дополнительной строке результата

· столбец 1: слово "ВСЕГО",

· столбец 2: общее количество сотрудников компании, которые никем не руководят.

Результат отсортировать по возрастанию по полю идентификатора отдела, к которому приписан сотрудник.

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

Пример вывода (значения получены на другом наборе данных):

DEPT CNT
   
   
   
   
   
... ...
   
ВСЕГО  
   

 

WITH

tabl1 AS (SELECT department_id

FROM (SELECT employee_id

FROM employees

MINUS

SELECT manager_id

FROM employees) t1 LEFT JOIN employees

ON t1.employee_id = employees.employee_id)

 

SELECT to_char(department_id) DEPT, cnt

FROM (SELECT department_id, count(*) cnt

FROM tabl1

GROUP BY department_id

ORDER BY department_id nulls first)

UNION ALL

SELECT 'Всего',

(SELECT count(*)

FROM tabl1)

FROM dual;

 

Результат:

 

DEPT CNT

---------------------------------------- ----------------------

10 1

20 1

30 5

40 1

50 40

60 4

70 1

80 29

100 5

110 1

Всего 89

 

12 rows selected

 

Комментарий:

Определяем сотрудников, которые никем не руководят, и выясняем, в каких отделах они работают. В каждом отделе определяем количество сотрудников, которые никем не руководят. Сортируем по номеру отдела, начиная с сотрудников, которые не приписаны ни к какому отделу. Затем добавляем в конец итоговый результат.

 

11. Выбрать сотрудников, для которых в таблице истории занятия должностей зафиксированы переходы на другую должность и отсутствуют сведения об их первой должности - той, которую они занимали при приеме на работу в компанию.

В результат вывести: Идентификатор сотрудника; Фамилию сотрудника; Дату, когда сотрудник был принят на работу; Идентификатор должности, которую занимает сотрудник в данный момент; Идентификатор подразделения, к которому в данный момент приписан сотрудник.

Результат отсортировать по возрастанию по полям: дата, когда сотрудник был принят на работу; фамилия сотрудника.

 

SELECT j.employee_id, e.last_name, e.hire_date, e.job_id, e.department_id

FROM job_history j LEFT JOIN employees e

ON e.employee_id = j.employee_id

WHERE j.employee_id NOT IN

(SELECT j.employee_id

FROM job_history j LEFT JOIN employees e

ON e.employee_id = j.employee_id

WHERE e.hire_date=j.start_date)

ORDER BY hire_date, last_name;

 

EMPLOYEE_ID LAST_NAME HIRE_DATE JOB_ID DEPARTMENT_ID

---------------------- ------------------------- ------------------------- ---------- ----------------------

114 Raphaely 07.12.94 PU_MAN 30

122 Kaufling 01.05.95 ST_MAN 50

 

2 rows selected

 

Комментарий:

В подзапросе мы выбираем тех сотрудников, у которых присутствуют сведения о занимаемой сотрудником первой должности. А потом выбираем только тех сотрудников, id которых не совпадает ни с одним id из выборки. Результат сортируем.

 

12. Создать запрос для вывода ФИО студентов и названий дисциплин, которые им надо изучить по учебному плану. Названия дисциплин должны быть представлены списком с разделителем в виде запятой и отсортированы по алфавиту.

 

WITH

tab1 AS (SELECT студенты.номер_студента,

студенты.фамилия || ' ' || студенты.имя || ' ' || студенты.отчество фио_студента,

название

FROM студенты INNER JOIN группы

ON студенты.номер_группы = группы.номер_группы

INNER JOIN учебные_планы

ON учебные_планы.код_специальности = группы.код_специальности

INNER JOIN дисциплины

ON учебные_планы.номер_дисциплины = дисциплины.номер_дисциплины)

 

SELECT фио_студента, MAX(ltrim(sys_connect_by_path(название, ', '), ', ')) "Названия дисциплин"

FROM (SELECT номер_студента, фио_студента, название, r,

lag(r,1) OVER (PARTITION BY номер_студента ORDER BY r) lg

FROM (SELECT номер_студента, фио_студента, название,

row_number() OVER (PARTITION BY номер_студента ORDER BY название) r

FROM tab1))

GROUP BY фио_студента

START WITH lg IS NULL

CONNECT BY PRIOR r = lg AND PRIOR номер_студента = номер_студента;

 

ФИО_СТУДЕНТА Названия дисциплин

----------------------------------------------- --------------------------------------------------------------------------------------

Поляков Анатолий Алексеевич Математика, Физика

Котенко Анатолий Николаевич Математика, Физика

Усов Валерий Харитонович Математика, Менеджмент, Экономика

Улиткин Андрей Сергеевич Математика, Менеджмент, Экономика

Нагорный Евгений Васильевич Математика, Физика

Устинов Владимир Викторович Математика, Менеджмент, Экономика

Ежов Алексей Павлович Математика, Менеджмент, Экономика

Старова Любовь Михайловна Математика, Физика

Гриценко Владимир Николаевич Математика, Физика

 

9 rows selected

 

Комментарий:

Формируем таблицу студентов и их предметов по учебному плану; фамилию, имя, отчество объединяем в один столбец ФИО_студента. Создаем список Студент – предмет, который он должен изучить, смещаем на одну строку вниз нумерованные названия дисциплин по каждому студенту. С помощью SYS_CONNECT_BY_PATH бежим от корня дерева к узлам и выводим список предметов с разделителем «,».

 

13. Из таблицы вида:

ID DES T
A a1  
A a2  
A a3  
B a1  
B a2  
C a3  

получить таблицу:

I a1 a2 a3
C      
B      
A      

 

create table tabl2

(ID VARCHAR2(1),

DES VARCHAR(2),

T NUMBER);

 

 

INSERT INTO tabl2 VALUES ('A', 'a1', 12);

INSERT INTO tabl2 VALUES ('A', 'a2', 3);

INSERT INTO tabl2 VALUES ('A', 'a3', 1);

INSERT INTO tabl2 VALUES ('B', 'a1', 10);

INSERT INTO tabl2 VALUES ('B', 'a2', 23);

INSERT INTO tabl2 VALUES ('C', 'a3', 45);

 

SELECT t1.id "I",

CASE WHEN t2.t IS NULL THEN 0 ELSE t2.t END "a1",

CASE WHEN t3.t IS NULL THEN 0 ELSE t3.t END "a2",

CASE WHEN t4.t IS NULL THEN 0 ELSE t4.t END "a3"

FROM (SELECT DISTINCT id

FROM tabl2) t1

LEFT JOIN (SELECT tabl2.id, tabl2.des, tabl2.t FROM tabl2 WHERE des = 'a1') t2

ON t1.id = t2.id LEFT JOIN (SELECT tabl2.id, tabl2.des, tabl2.t FROM tabl2 WHERE des = 'a2') t3

ON t1.id = t3.id LEFT JOIN (SELECT tabl2.id, tabl2.des, tabl2.t FROM tabl2 WHERE des = 'a3') t4

ON t1.id = t4.id

ORDER BY t1.id DESC;

 

Комментарий:

Соединяем значение id со значениями столбца T таблицы tab12 для a1, a2, a3 по значениям из столбца id. Если соответствующего значения T нет в изначальной таблице, то в результирующей таблице на этом месте будет NULL, поэтому мы заменяем Null на 0.

 

14. Покажите в одном отчете для всех отделов: его номер, наименование, количество работающих сотрудников, средний оклад вместе со следующими данными по каждому сотруднику – фамилия, оклад и должность.

 

SELECT dept_id "Номер отдела", dept_name "Название отдела",cnt "Количество сотрудников",

ROUND(avg_salary, 2) "Средний оклад",l_name Фамилия,sal Оклад,title Должность

FROM

(SELECT s.dept_id,s.dept_name,s.cnt,s.avg_salary,s.l_name,sal,s.title, s.emp_dept

FROM (SELECT d.department_id dept_id, d.department_name dept_name,

COUNT(*) OVER(PARTITION BY d.department_id) cnt,

avg(e.salary) OVER(PARTITION BY d.department_id) avg_salary,

e.last_name l_name, e.department_id emp_dept, e.salary sal, j.job_title title

FROM employees e, departments d, jobs j

WHERE e.department_id=d.department_id AND e.job_id=j.job_id

GROUP BY d.department_id, d.department_name, e.last_name, e.department_id, e.salary, j.job_title) s

GROUP BY GROUPING SETS((dept_id,dept_name,cnt,avg_salary),(l_name,sal,title, emp_dept)))

ORDER BY (CASE WHEN dept_id IS NOT NULL THEN dept_id ELSE emp_dept END), dept_id;

 

 

Результат:

117 rows selected

 

Комментарий:

Выбираем непосресдственно все необходимые данные для каждого отдела, включая сотрудников в этом отделе. Группируем соответственно отделы отдельно, сотрудников отдельно. Упорядочиваем сотрудников относительно отделов.

 

15. Имеется таблица с набором чисел, например:

ID
 
 
 
 
 

Для любого заданного числа необходимо запросом определить, в какой диапазон попало это число, и округлить его до ближайшей границы.

 

drop table tab3;

CREATE TABLE tab3

(ID NUMBER (5));

INSERT INTO tab3 VALUES (55000);

INSERT INTO tab3 VALUES (45000);

INSERT INTO tab3 VALUES (30000);

INSERT INTO tab3 VALUES (10000);

INSERT INTO tab3 VALUES (70000);

UNDEFINE code;

 

WITH tab33

AS (SELECT id

FROM tab3

ORDER BY id)

SELECT CASE WHEN to_number('&&code')

BETWEEN

(SELECT id FROM (SELECT id, rownum r FROM tab33) WHERE rownum = 1)

AND

(SELECT id FROM (SELECT id, rownum r FROM tab33) WHERE r = (SELECT count(id) FROM tab33))

THEN (SELECT to_char(id)

FROM tab33

WHERE abs(to_number('&code')-id) =

(SELECT MIN(interv)

FROM (SELECT abs(to_number('&code')-id) as interv

FROM tab33)))

ELSE 'значение вне диапозона' end AS code

from dual;

 

Результат:

 

Для 23000

CODE

----------------------------------------

 

1 rows selected

 

Для 1000 или 75000

CODE

----------------------------------------

значение вне диапазона

 

1 rows selected

 

Комментарий:

С помощью with формируем временное представление, строки в котором отрортированы в порядке возрастания значений. Сравниваем введенное значение с первой и последней строкой таблицы. Если значение попало в диапазон, то сравниваем его с каждой строкой таблицы и выбираем id, где разница между введенным значением и значением в строке минимальна. Если не введенное значение меньше, чем значение в первой строке, или больше, чем значение в последней строке, то выдается сообщение «значение вне диапозона»

 

16. Имеется таблица LCKS с двумя столбцами - Lcker и Lcked, каждая запись в которой связывает 2 объекта - заблокированного (Lcked) и того, кто его заблокировал (Lcker). Необходимо отобразить SQL-запросом иерархию заблокированных объектов, включая те объекты, которые являются причинами всех блокировок. Уровни иерархии выделять отступами от левого края состоящими из пробелов - по одному на каждый новый уровень.

 

Пример таблицы LCKS:

Lcker Lcked

A B

A C

B D

D E

C F

C J

C H

Надо вывести:

A

B

D

E

C

F

H

J

 

CREATE TABLE LCKS

(Lcker VARCHAR2(1),

Lcked VARCHAR2(1));

 

INSERT INTO LCKS VALUES('A', 'B');

INSERT INTO LCKS VALUES('A', 'C');

INSERT INTO LCKS VALUES('B', 'D');

INSERT INTO LCKS VALUES('D', 'E');

INSERT INTO LCKS VALUES('C', 'F');

INSERT INTO LCKS VALUES('C', 'J');

INSERT INTO LCKS VALUES('C', 'H');

 

WITH

t AS (

SELECT lcker, rownum r FROM (SELECT lcker


Дата добавления: 2015-08-18; просмотров: 125 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Main_Table PK User_Constraints 2 страница| Main_Table PK User_Constraints 4 страница

mybiblioteka.su - 2015-2024 год. (0.075 сек.)