Читайте также: |
|
Сначала задаем исходную строку, затем в разделе RULES организуем цикл, для которого задаем количество итераций ITERATE (500). При это в каждой итерации цикла новая строка получается из предыдущей путем замены двойного пробела на одиночный. Так, мы в конце концов получим строчку только с одиночными пробелами, которая будет самой последней после выполнения цикла. Присвоив каждой строке свой номер с помощью ROWNUM, и выдернув затем строку с самым большим номером, мы и найдем искомую.
16. Показать в одном отчете для каждого отдела: его номер, наименование, количество работающих сотрудников, средний оклад вместе со следующими данными по каждому сотруднику – фамилия, оклад и должность.
Номер отдела | Название отдела | Количество сотрудников | Средний оклад | Фамилия | Оклад | Должность |
Purchasing | ||||||
Khoo | Purchasing Clerk | |||||
Baida | Purchasing Clerk | |||||
Tobias | Purchasing Clerk | |||||
Himuro | Purchasing Clerk | |||||
Colmenares | Purchasing Clerk | |||||
Human Resources | ||||||
Mavris | Human Resources Representative | |||||
Shipping | 3475,56 | |||||
Weiss | Stock Manager | |||||
Fripp | Stock Manager | |||||
Kaufling | Stock Manager | |||||
… | …… | …… | ……. |
SELECT
DECODE(ddept_id, NULL, ' ', ddept_id) AS "Номер отдела",
DECODE(dept_name, NULL, ' ', dept_name) AS "Название отдела",
DECODE(col, NULL, ' ', col) AS "Количество сотрудников",
DECODE(ROUND(avgsal,2), NULL, ' ', ROUND(avgsal,2)) AS "Средний оклад",
DECODE(last_name, NULL, ' ', last_name) AS "Фамилия",
DECODE(salary, NULL, ' ', salary) AS "Оклад",
DECODE(jt, NULL, ' ', jt) AS "Должность"
FROM (SELECT ddept_id, dept_name, col, avgsal, last_name, salary, jt, edept_id
FROM (SELECT d.department_id AS ddept_id, d.department_name AS dept_name,
COUNT(e.employee_id) OVER (PARTITION BY d.department_id) AS col,
AVG(e.salary) OVER (PARTITION BY d.department_id) AS avgsal, e.last_name AS last_name,
e.department_id AS edept_id, e.salary AS salary, j.job_title AS jt
FROM employees e JOIN departments d ON e.department_id = d.department_id
JOIN jobs j ON e.job_id = j.job_id)
GROUP BY GROUPING SETS ((ddept_id, dept_name, col, avgsal),(last_name, salary, jt, edept_id))
ORDER BY ddept_id, edept_id)
ORDER BY
(CASE WHEN ddept_id IS NOT NULL
THEN ddept_id
ELSE edept_id END), ddept_id;
Комментарий:
В самом вложенном подзапросе соединяем таблицы Employees и Departments и, применяя аналитические функции, получаем необходимую нам информацию. Выборку группируем по отделам. В следующем селекте, данные для которого выбираем из только что полученной информации, используем наборы группировок GROUPING SETS, чтобы группировать данные по определенным группам. После этого применяем функции DECODE для различных столбцов, чтобы задать им то, что они должны выводить при определенных значениях. Ну и напоследок задаем сортировку с помощью ORDER BY по номеру отдела.
17. В произвольной строке, состоящей из символьных элементов, разделенных запятыми, отсортировать элементы по алфавиту. Например, символьную строку
abc,cde,ef,gh,mn,test,ss, df,fw,ewe,wwe
преобразовать к виду:
abc,cde,df,ef,ewe, fw,gh,mn,ss,test,wwe.
with src as
(select 'abc,cde,ef,gh,mn,test,ss, df,fw,ewe,wwe' str
from dual)
select str
--соединяем столбец из значений строки в строку
from(select ltrim(sys_connect_by_path(substr,','),',') str
from(select substr, rownum rnum1, lag(rownum) over (order by substr) rnum2
--выводим столбик из значений нашей строки
from(select substr
from(select regexp_substr(str,'([[:alpha:]])*',1, level) substr
from src
connect by level < length (str))
where substr is not null
order by 1))
start with rnum2 is null
connect by prior rnum1 = rnum2
order by 1 desc) --сортируем что бы получить результирующую строку
where rownum = 1;
Результат:
abc,cde,df,ef,ewe,fw,gh,mn,ss,test,wwe
18. Выделить в HTML разметке содержимое блоков с установленными атрибутами:
· тег <p> с CSS классом content
· тег <li> с CSS классом content
Например, для разметки:
<p>Абзац 1</p>
<p class="content">Абзац 2</p>
<ul>
<li>Элемент 1</li>
<li class="content">Элемент 2</li>
</ul>
Должно быть выделено:
<p class="content">Абзац 2</p>
<li class="content">Элемент 2</li>
with src as
(
select
'<p>Абзац 1</p>
<p class="content">Абзац 2</p>
<ul>
<li>Элемент 1</li>
<li class="content">Элемент 2</li>
</ul>' str
from dual)
select ltrim(substr)
-- с помощю регулярного выражения ищем нужные подстроки пока хотя бы одна из них не null
from(select regexp_substr(str,'.*<p class="content">.*',1,level) substr
from src
connect by regexp_substr(str,'.*<p class="content">.*',1,level) is not null
union all
select regexp_substr(str,'.*<li class="content">.*',1,level) substr
from src
connect by regexp_substr(str,'.*<li class="content">.*',1,level) is not null);
Результат:
<p class="content">Абзац 2</p>
<li class="content">Элемент 2</li>
Комментарий:
Сначала просто выбираем введенный нами тэг из таблицы Dual и сохраняем его как tab_tag с помощью WITH. Во внутренних запросах применяем регулярные выражения regexp_substr для искомых частей <p class="content и li class="content, при этом указывая, что до и после них могут стоять любые символы. Затем из этих «подтэгов» (subtag) обрезаем лишние пробелы и выводим результат.
19. Создать запрос для получения списка городов и отделов, расположенных в них. Результаты представить в виде:
Город | Отдел |
Seattle | Accounting, Administration,Benefits, Construction,Control And Credit |
Toronto | Marketing |
Список отделов в каждом городе должен быть отсортирован по алфавиту.
WITH tab AS
(SELECT t.*,
LAG (t.rn) OVER (PARTITION BY t.location_id ORDER BY t.rn) prev
FROM(SELECT d.location_id, l.city,d.department_name,
ROW_NUMBER () OVER (PARTITION BY l.city ORDER BY d.department_name) rn
FROM departments d INNER JOIN locations l
ON d.location_id=l.location_id
ORDER BY 2,3) t)
SELECT city город, max(dept) отделы
FROM (SELECT city, rn, LTRIM(sys_connect_by_path(department_name, ', '), ', ') As Dept
FROM tab
START WITH prev IS NULL
CONNECT BY PRIOR rn = prev AND PRIOR location_id = location_id)
GROUP BY city;
Результат:
London Human Resources
Seattle Accounting,Administration,Benefits,Construction,Contracting,Corporate Tax,Executive,Finance,Government Sales,IT Helpdesk,IT Support,Manufacturing,NOC,Operations,Payroll,Purchasing,Recruiting, Retail Sales,Shareholder Services,Treasury,1 Control And Credit
Munich Public Relations
South San Francisco Shipping
Toronto Marketing
Southlake IT
Oxford Sales
Комментарий:
В первом запросе соединяем таблицы Locations и Departments для получения информации о названиях городов и отделов, а также присваиваем им номера с помощью применения аналитической функции row_number. Командой WITH сохраняем полученные значения в tab. А затем к полученным данным применяем функцию sys_connect_by_path с условиями start with и connect by prior и получаем искомый результат.
20. Создать запрос для получения информации о количестве преподавателей, работающих на кафедрах в разных должностях. Результат запроса должен быть представлен в виде:
Кафедра1 | Кафедра2 | Итого | |
Профессор | |||
Доцент | |||
……. | |||
Итого: |
with
aux_tbl as(select distinct должность,
--подсчет количества должностей преподавателей на кафедре 1
(select count(номер_преподавателя)
from преподаватели where кафедра = 'Кафедра 1' and должность = п.должность) as "Кафедра 1",
--подсчет количества должностей преподавателей на кафедре 2
(select count(номер_преподавателя)
from преподаватели where кафедра = 'Кафедра 2' and должность = п.должность) as "Кафедра 2",
----подсчет общего количества должностей преподавателей на кафедрах
(select count(номер_преподавателя)
from преподаватели where должность = п.должность) as "Всего:"
from преподаватели п
order by должность desc)
select *
from aux_tbl
union all
--количество преподавателей на кафедре 1, кафедре 2 и общее число преподавателей
select 'Итого:', sum("Кафедра 1"), sum("Кафедра 2"), sum("Всего:")
from aux_tbl;
Результат:
Профессор 1 0 1
Преподаватель 1 1 2
Доцент 1 2 3
Ассистент 1 1 2
Итого: 4 4 8
Комментарий:
Сначала для первой кафедры находим количество каждых должностей на этой кафедре, затем делаем то же самое для второй кафедры, затем четвертым столбиком выводим количество каждых должностей для обеих кафедр. Далее объединяем получившуюся таблицу с «итоговым» селектом.
ВАРИАНТ 18
(Базы данных Студент и Human Resources)
1. В таблицу Специальности добавить столбец Шифр Специальности. Написать и выполнить команду, позволяющую внести в этот столбец сокращенное наименование специальности, состоящее из первых букв каждого слова названия специальности.
ALTER TABLE специальности
ADD(Шифр_специальности VARCHAR2(10));
table СПЕЦИАЛЬНОСТИ altered.
MERGE INTO специальности s
USING
(SELECT код_специальности, название_специальности,
REPLACE(TRANSLATE(INITCAP(название_специальности), 'йцукенгшщзхъфывапролджэячсмитьбю', ' '), ' ', '') AS Шифр_специальности
FROM специальности) s1
ON (s.код_специальности = s1.код_специальности)
WHEN MATCHED THEN
UPDATE SET s.шифр_специальности = s1.шифр_специальности;
4 rows merged.
SELECT *
FROM специальности;
КОД_СПЕЦИАЛЬНОСТИ НАЗВАНИЕ_СПЕЦИАЛЬНОСТИ Шифр_Специальности
---------------------- ---------------------------------------- ------------------
1 СИСТЕМЫ АВТОМАТИЧЕСКОГО УПРАВЛЕНИЯ САУ
2 МАТЕМАТИЧЕСКОЕ ОБЕСПЕЧЕНИЕ ЭВМ МОЭ
3 ВЫЧИСЛИТЕЛЬНЫЕ СЕТИ И СИСТЕМЫ ВСИС
4 ЭКОНОМИКА ПРЕДПРИЯТИЙ ЭП
4 rows selected
2. Создать запрос для определения дат начала проведения Уимблдонского турнира в ближайшие сто лет, зная, что турнир начинается за шесть недель до последнего понедельника августа.
SELECT TO_CHAR(NEXT_DAY(LAST_DAY('1.08.'||(TO_CHAR(SYSDATE,'YYYY') + level - 1)) - 7, 'Понедельник') - 42,'DD.MM.YYYY')
AS "Wimbledoon start"
FROM dual
CONNECT BY level <= 100;
Wimbledoon start
----------------
16.07.2012
15.07.2013
14.07.2014
20.07.2015
18.07.2016
17.07.2017
………
15.07.2109
14.07.2110
20.07.2111
100 rows selected
3. Создать внешнюю таблицу для чтения данных из текстового файла, содержащего информацию в виде:
Номер ФИО Дата Оценка Дисциплина
1 Петров С.С. 12-05-2008 4 Математика
2 Сомов Л.Л. 4-05-2008 5 Физика
3 Амосов Д.Г. 3-05-2008 4 Физика
CREATE TABLE stud_ex
(НОМЕР NUMBER(1),
ФИО VARCHAR2(25),
Дата DATE,
Оценка NUMBER(1),
Дисциплина VARCHAR2(25))
ORGANIZATION EXTERNAL
(TYPE oracle_loader
DEFAULT DIRECTORY stud
ACCESS PARAMETERS
(RECORDS DELIMITED BY NEWLINE
LOGFILE stud:'log111'
BADFILE stud:'bad111'
FIELDS TERMINATED BY WHITESPACE LRTRIM
(НОМЕР POSITION (1:8) CHAR,
ФИО POSITION (10:26) CHAR,
Дата POSITION(28:40) CHAR(13) date_format DATE mask "dd-mm-yyyy",
Оценка POSITION (42:52) CHAR,
Дисциплина POSITION (54:74) CHAR))
LOCATION ('marks.txt'))
REJECT LIMIT UNLIMITED;
SELECT *
FROM stud_ex;
НОМЕР ФИО ДАТА ОЦЕНКА ДИСЦИПЛИНА
----- ------------------------- -------- ------ ----------------------
1 Петров С.С. 12.05.08 4 Математика
2 Сомов Л.Л. 04.05.08 5 Физика
3 Амосов Д.Г. 03.05.08 4 Физика
4. Создать запрос для вывода всех дат из заданного диапазона, отсутствующих в датах приема на работу преподавателей. Даты начала и окончания диапазона задаются параметрически.
undefine fdate;
undefine ldate;
WITH tab_d
AS (SELECT dates
FROM (SELECT TRUNC(d + rn) dates
FROM (SELECT level rn, TO_DATE('&&fdate','DD.MM.YYYY')-1 d
FROM dual
CONNECT BY level <= TO_DATE('&&ldate','DD.MM.YYYY') + 1 - TO_DATE('&fdate','DD.MM.YYYY')))
ORDER BY dates)
SELECT *
FROM tab_d
MINUS
SELECT DISTINCT dates
FROM tab_d INNER JOIN преподаватели p
ON tab_d.dates = p.дата_контракта AND p.дата_контракта < TO_DATE('&ldate','DD.MM.YYYY')
AND p.дата_контракта > TO_DATE('&fdate','DD.MM.YYYY');
5. Создать запрос, позволяющий выводить информацию о студентах и преподавателях (Фамилия с инициалами, Зарплата/Стипендия, Статус – преподаватель или студент).
SELECT TO_CHAR(Фамилия || SUBSTR(Имя,1,1) ||'.'|| SUBSTR(Отчество,1,1) ||'.') AS "ФИО", зарплата AS "Зарплата/стипендия", 'Преподаватель' AS "Статус"
FROM преподаватели
UNION
SELECT TO_CHAR(Фамилия || SUBSTR(Имя,1,1) ||'.'|| SUBSTR(Отчество,1,1) ||'.') AS "ФИО", стипендия AS "Зарплата/стипендия", 'Студент' AS "Статус"
FROM студенты;
ФИО Зарплата/стипендия Статус
АбдуловС.А. 3000 Преподаватель
ВикулинаВ.И. 3000 Преподаватель ГриценкоВ.Н. 300 Студент
ЗагарийчукИ.Д. 2000 Преподаватель
КазанкоВ.В. 2000 Преподаватель
13 rows selected
6. Создать запрос для вывода фамилий трех самых высокооплачиваемых преподавателей. К списку добавить преподавателей, которые получают такую же зарплату, как и самый низкооплачиваемый из трех высокооплачиваемых. Задачу решить с использованием аналитических функций.
SELECT фамилия, зарплата
FROM (SELECT фамилия,зарплата,
RANK () OVER(ORDER BY зарплата desc) r,
ROW_NUMBER () OVER(ORDER BY зарплата desc) rn,
DENSE_RANK () OVER(ORDER BY зарплата desc) dr
FROM преподаватели)
WHERE r=rn and dr IN (1,2,3) OR dr=3;
ФАМИЛИЯ ЗАРПЛАТА
-------------------- --------
Костыркин 4000
Викулина 3000
Абдулов 3000
7. 7. Создать запрос для определения стажа работы преподавателей. Результат вывести в формате ## лет ## мес ## дней.
SELECT фамилия, дата_контракта, (TRUNC(MONTHS_BETWEEN(sysdate, дата_контракта)/12)|| ' лет '||
TRUNC(MOD(MONTHS_BETWEEN(sysdate, дата_контракта), 12))|| ' месяцев '||
CASE
WHEN SUBSTR(sysdate, 0, 2) < SUBSTR(дата_контракта, 0, 2)
THEN SUBSTR(LAST_DAY(ADD_MONTHS(дата_контракта, TRUNC(MONTHS_BETWEEN(sysdate, дата_контракта)))), 0, 2) - SUBSTR(дата_контракта, 0, 2) + substr(sysdate, 0, 2)
WHEN SUBSTR(sysdate, 0, 2) >= SUBSTR(дата_контракта, 0, 2)
THEN SUBSTR(sysdate, 0, 2) - SUBSTR(дата_контракта, 0, 2)
END || ' дней') AS "RESULT"
FROM преподаватели;
ФАМИЛИЯ ДАТА_КОНТРАКТА RESULT
-------------------- -------------- --------------------------
Костыркин 01.09.97 14 лет 9 месяцев 4 дней
Викулина 01.04.98 14 лет 2 месяцев 4 дней
Соколов 01.02.78 34 лет 4 месяцев 4 дней
Казанко 01.09.88 23 лет 9 месяцев 4 дней
Абдулов 01.06.88 24 лет 0 месяцев 4 дней
8. Создать представление для вывода фамилии преподавателя, должности и зарплаты. Представление должно гарантировать, что пользователь не сможет ввести отрицательное значение зарплаты и зарплату, большую 50000.
CREATE VIEW prepod_info
AS SELECT фамилия, должность, зарплата
FROM преподаватели
WHERE зарплата BETWEEN 0 AND 50000
WITH CHECK OPTION;
view PREPOD_INFO created.
SELECT *
FROM prepod_info;
ФАМИЛИЯ ДОЛЖНОСТЬ ЗАРПЛАТА
-------------------- -------------------- --------
Костыркин Профессор 4000
Викулина Доцент 3000
Соколов Ассистент 1500
Казанко Преподаватель 2000
Абдулов Доцент 3000
Студейкин Доцент 2500
Загарийчук Ассистент 2000
Тарасова Преподаватель 2000
9 rows selected
9. Создать представление, которое выводит фамилию студента, оценку, дату сдачи экзамена и название предмета. Оценка должна выводиться в формате: отл, хор, удовл или неудовл. Для студентов, не сдававших экзамен, должно выводиться – Не сдавал – в столбцах Оценка, Дата сдачи экзамена и Название предмета.
CREATE VIEW stud_exams
AS SELECT s.фамилия,
CASE u.оценка
WHEN 5 THEN 'отл'
WHEN 4 THEN 'хор'
WHEN 3 THEN 'удовл'
WHEN 2 THEN 'неудовл'
ELSE 'Не сдавал' END "ОЦЕНКА",
DECODE(u.оценка, NULL, 'Не сдавал', TO_CHAR(u.дата)) AS "ДАТА СДАЧИ",
DECODE (u.оценка, NULL, 'Не сдавал', TO_CHAR(p.название)) AS "НАЗВАНИЕ ПРЕДМЕТА"
FROM студенты s join группы g ON s.номер_группы = g.номер_группы
JOIN учебные_планы up ON g.код_специальности = up.код_специальности
LEFT JOIN успеваемость u ON s.номер_студента = u.номер_студента AND up.номер_дисциплины = u.номер_дисциплины
LEFT JOIN дисциплины p ON up.номер_дисциплины = p.номер_дисциплины;
view STUD_EXAMS created.
SELECT *
FROM stud_exams;
ФАМИЛИЯ ОЦЕНКА ДАТА СДАЧИ НАЗВАНИЕ ПРЕДМЕТА
--------------- -------- ---------- ----------------
Поляков отл 10.06.99 Физика
Старова отл 10.06.99 Физика
Старова отл 12.06.99 Математика
Гриценко неудовл 10.06.99 Физика
……….
Ежов Не сдавал Не сдавал Не сдавал
Улиткин Не сдавал Не сдавал Не сдавал
Устинов Не сдавал Не сдавал Не сдавал
9 rows selected
10. Создать запрос для получения списка дисциплин, которые изучаются на всех специальностях.
SELECT название
FROM (SELECT DISTINCT номер_дисциплины, COUNT(*) OVER(PARTITION BY номер_дисциплины) col
FROM учебные_планы) tab_disc
INNER JOIN дисциплины d ON tab_disc.номер_дисциплины = d.номер_дисциплины
WHERE col = (SELECT COUNT(*)
FROM (SELECT DISTINCT код_специальности
FROM учебные_планы));
НАЗВАНИЕ
------------------------------
Математика
11. Создать запрос, который выводит фамилию студента, стипендию и процент, который составляет его стипендия от суммарной стипендии студентов, обучающихся в той же группе. Задачу решить при помощи использования аналитических функций.
SELECT фамилия, стипендия, ROUND(100*стипендия/SUM(стипендия) OVER (PARTITION BY номер_группы),2)||'%' AS процент
FROM студенты;
ФАМИЛИЯ СТИПЕНДИЯ ПРОЦЕНТ
--------------- --------- ---------------------------------
Поляков 200 26,67%
Старова 250 33,33%
Гриценко 300 40%
Котенко 0 0%
Нагорный 200 100%
12. Создать запрос для получения информации о количестве полученных студентами пятерок, четверок, троек и двоек. Результат запроса должен быть представлен в виде:
Фамилия | Кол-во 5 | Кол-во 4 | Кол-во 3 | Кол-во 2 | Итого |
Поляков | |||||
Старова | |||||
Нагорный | |||||
Итого: |
WITH grades
AS (SELECT s.фамилия,
COUNT(decode(u.оценка, 5, s.номер_студента)) AS Кол_во5,
COUNT(decode(u.оценка, 4, s.номер_студента)) AS Кол_во4,
COUNT(decode(u.оценка, 3, s.номер_студента)) AS Кол_во3,
COUNT(decode(u.оценка, 2, s.номер_студента)) AS Кол_во2,
COUNT(оценка) AS Итого
FROM студенты s LEFT JOIN
(SELECT DISTINCT u1.номер, u1.оценка, u1.дата, u1.номер_студента, u1.номер_дисциплины
FROM успеваемость u1 JOIN успеваемость u2
ON u1.номер_студента = u2.номер_студента AND u1.номер_дисциплины = u2.номер_дисциплины
MINUS
SELECT DISTINCT u1.номер, u1.оценка, u1.дата, u1.номер_студента, u1.номер_дисциплины
FROM успеваемость u1 JOIN успеваемость u2
ON u1.номер_студента = u2.номер_студента AND u1.номер_дисциплины = u2.номер_дисциплины
WHERE u1.оценка!= u2.оценка
UNION
SELECT u1.номер, u1.оценка, u1.дата, u1.номер_студента, u1.номер_дисциплины
FROM успеваемость u1 join успеваемость u2
ON u1.номер_дисциплины = u2.номер_дисциплины AND u1.номер_студента = u2.номер_студента
AND u1.оценка!= u2.оценка AND u1.дата > u2.дата) u
ON s.номер_студента = u.номер_студента
GROUP BY s.фамилия)
SELECT *
FROM grades
UNION ALL
SELECT 'Итого', SUM(Кол_во5), SUM(Кол_во4), SUM(Кол_во3), SUM(Кол_во2), SUM(Итого)
FROM grades;
ФАМИЛИЯ КОЛ_ВО5 КОЛ_ВО4 КОЛ_ВО3 КОЛ_ВО2 ИТОГО
--------------- ------- ------- ------- ------- -----
Ежов 0 0 0 0 0
Нагорный 1 0 0 0 1
Устинов 0 0 0 1 1
Гриценко 0 0 1 1 2
Усов 1 1 1 0 3
….
Поляков 1 1 0 0 2
Итого 5 2 2 2 11
9 rows selected
13. Создать запрос для получения информации о кафедрах в виде:
Кол-во сотрудников | Средняя зарплата | Максимальная зарплата | |
Кафедра1 | |||
Кафедра2 | |||
В целом: |
ВОЗМОЖНО, НЕВЕРНО
SELECT DISTINCT кафедра AS " ",
COUNT(*) OVER(PARTITION BY кафедра) AS "Кол_во сотрудников",
AVG(зарплата) OVER(PARTITION BY кафедра) AS "Средняя зарплата",
MAX(зарплата) OVER(PARTITION BY кафедра) AS "Максимальная зарплата"
FROM преподаватели
UNION ALL
SELECT 'В целом', COUNT(*), AVG(зарплата), MAX(зарплата)
FROM преподаватели;
14. Создать запрос для получения информации о фамилиях преподавателей, должностях преподавателей, фамилиях их начальников и должностях начальников.
SELECT p.фамилия, p.должность, pr.фамилия AS "Фамилия начальника", pr.должность AS "Должность начальника"
FROM преподаватели p LEFT JOIN преподаватели pr ON pr.номер_преподавателя = p.подчиняется;
ФАМИЛИЯ ДОЛЖНОСТЬ Фамилия начальника Должность начальника
----------- --------------- ------------------- --------------------
Викулина Доцент Костыркин Профессор
Соколов Ассистент Викулина Доцент
Казанко Преподаватель Соколов Ассистент
Тарасова Преподаватель Абдулов Доцент
…
Абдулов Доцент
Костыркин Профессор
9 rows selected
15. Удалить из таблицы Преподаватели всех преподавателей, которые подчиняются Викулиной (непосредственно и опосредованно).
DELETE FROM преподаватели
WHERE номер_преподавателя IN (SELECT номер_преподавателя
FROM преподаватели
WHERE фамилия!= 'Викулина'
START WITH фамилия = 'Викулина'
CONNECT BY PRIOR номер_преподавателя = подчиняется);
2 rows deleted.
SELECT *
FROM преподаватели;
16. Из произвольной символьной строки удалить лишние пробелы между словами, оставив только по одному. Задачу решить при помощи раздела Model без использования регулярных выражений.
Дата добавления: 2015-08-18; просмотров: 433 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Main_Table PK User_Constraints 16 страница | | | Main_Table PK User_Constraints 18 страница |