Читайте также: |
|
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 страница |