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

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

Main_Table PK User_Constraints 13 страница | Main_Table PK User_Constraints 14 страница | Main_Table PK User_Constraints 15 страница | Main_Table PK User_Constraints 16 страница | Main_Table PK User_Constraints 17 страница | Main_Table PK User_Constraints 18 страница | Main_Table PK User_Constraints 19 страница | Main_Table PK User_Constraints 20 страница | Main_Table PK User_Constraints 21 страница | Main_Table PK User_Constraints 22 страница |


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

MEASURES(A, Col1, Col1 total, 1 GRP)

RULES(total[rn > 1] ORDER BY A = case

when total[cv() - 1] + Col1[cv()] <= 100 then total[cv() - 1] + COL1[cv()]

else COL1[cv()] end,

GRP[rn > 1] ORDER BY A = case

when total[cv() - 1] + Col1[cv()] <= 100 then GRP[cv() - 1]

else GRP[cv()-1] +1 end)

order by rn

 

A COL1 GRP

- ---- ---

1 10 1

2 90 1

10 50 4

 

10 rows selected

 

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

1) Таблица test2 содержит исходные данные

2) В качестве измерения в Model взят столбец rownum, а столбцы выборки Col1, total, A и GRP

3) Обозначены следующие правила записи значений в столбцах:

Если значение в текущей строке столбца Col1 + значение в предыдущей строке столбца total меньше 100, то значение в текущей строке столбца total = сумме этих значений

Иначе = значению в текущей строке столбца GRP

4) Исходя из значений в столбце total изменяются и значения в столбце GRP по тем же правилам, только значение устанавливается либо прошлое +1, либо прошлое


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

ID
 
 
 
 
 

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

 

select case when avg(m) - min(m) = 0 then min(m)

else '&&num' - sign(avg(m) - '&&num')*min(abs('&&num' - m)) end as result

from(select min(id) as m

from rang

where '&&num' <= id

union

select max(id)

from rang

where '&&num' >= id);

 

RESULT

------

 

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

1) с помощью union соединяем две таблицы, одна содержит нижнюю границу, вхождения, другая – верхнюю. Rang – таблица с границами.

2) Далее из полученной таблицы выбираем наиболее близкое к введенному числу. Для этого из введенного вычитаем (с учетом знака) минимальную разность между границами и введенным числом, т.е если введено, например 33000, а границы 30000 и 45000, то из 33000 мы вычтем (33000 – 30000, так как 3000 < 12000) а если введено 44000 то мы из 44000 вычтем (44000 – 45000 так как 1000 < 14000)

3) Case для того, чтобы исключить варианты, когда введенное число не входит ни в один интервал


ВАРИАНТ 25

(Базы данных Студент и Human Resources)

1. В таблицу СПЕЦИАЛЬНОСТИ добавить столбец Шифр Специальности. Написать и выполнить команду, позволяющую внести в этот столбец сокращенное наименование специальности, состоящее из первых букв каждого слова названия специальности.

 

ALTER TABLE СПЕЦИАЛЬНОСТИ ADD "Шифр_Специальности" VARCHAR2(8);

-- MERGE INTO - многострочный UPDATE

MERGE INTO СПЕЦИАЛЬНОСТИ t1

USING (

-- initcap(‘sTr lOL’) ->’Str Lol’ (первая буква заглавная, остальные строчные)

-- translate(‘11blabla222blabla3’, ‘123‘,’456’) ->’44blabla555blabla6’ (все ‘1’->’4’, все ‘2’->’5’, и тд)

-- replace(‘s/t/r/’,’/’,’’) -> ‘str’

SELECT КОД_СПЕЦИАЛЬНОСТИ, НАЗВАНИЕ_СПЕЦИАЛЬНОСТИ,

replace(translate(initcap(НАЗВАНИЕ_СПЕЦИАЛЬНОСТИ),'абвгдеёжзийклмнопрстуфхцчшщьыъэюя',' '),' ','') "Шифр_Специальности"

FROM СПЕЦИАЛЬНОСТИ) t2

ON (t1.КОД_СПЕЦИАЛЬНОСТИ=t2.КОД_СПЕЦИАЛЬНОСТИ)

WHEN MATCHED THEN

UPDATE SET t1."Шифр_Специальности"=t2."Шифр_Специальности"

 

КОД_СПЕЦИАЛЬНОСТИ НАЗВАНИЕ_СПЕЦИАЛЬНОСТИ Шифр_Специальности

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

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

2 МАТЕМАТИЧЕСКОЕ ОБЕСПЕЧЕНИЕ ЭВМ МОЭ

3 ВЫЧИСЛИТЕЛЬНЫЕ СЕТИ И СИСТЕМЫ ВСИС

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

4 rows selected

 

2. Создать запрос для определения дат начала проведения Уимблдонского турнира в ближайшие сто лет, зная, что турнир начинается за шесть недель до последнего понедельника августа.

 

-- 6 недель - 42 дня

SELECT TO_CHAR(NEXT_DAY(TO_DATE('31.08.' || (TO_CHAR(SYSDATE, 'YYYY')+ level-1)), 'ПОНЕДЕЛЬНИК')-42,'DD.MM.YY') "Дата начала турнира"

FROM DUAL CONNECT BY level <= 100

 

Дата начала турнира

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

23.07.12

22.07.13

21.07.14

….

23.07.08

22.07.09

21.07.10

27.07.11

100 rows selected

3. Используя только таблицу DUAL вычислить и вывести в результат все числа Фибоначчи в диапазоне от 1 до 1000 (1 <= n_fib <= 1000). Числа в результате не должны повторяться и должны быть отсортированы по возрастанию.

В результате должен получиться список из 15 чисел, отсортированных по возрастанию:

N_FIB
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987

 

-- выбираем самую длинную строку столбца (последнюю)

SELECT MAX(s) "N_FIB"

FROM (

SELECT s

FROM DUAL

MODEL

DIMENSION BY (0 d)

-- нужно примерно знать длину результирующей строки (<80 байт в нашем случае)

MEASURES (CAST(' ' AS VARCHAR2(80)) s, 0 f)

RULES ITERATE (15) (

-- вычисление числа фибоначчи в зависимости от номера итерации

f[iteration_number] = DECODE(iteration_number, 0, 1, 1, 2, f[iteration_number-1] + f[iteration_number-2]),

-- результирующее значение ячейки (текущ = предыдущ, нов_число; кроме 1й итерации, где: текущ = нов_число)

s[iteration_number] = DECODE(iteration_number, 0, TO_CHAR(f[iteration_number]), s[iteration_number-1] || ', ' || TO_CHAR(f[iteration_number]))))

 

N_FIB

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

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987

1 rows selected

 

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

 

SELECT TO_DATE(s)+ level-1, 'dd.mm.yyyy' as "Даты в диапазоне"

FROM (

SELECT '&Дата_начала' s, '&Дата_окончания' e

FROM dual)

CONNECT BY level <= TO_DATE(e) - TO_DATE(s) +1

MINUS

-- убираем даты приема

SELECT TO_DATE(TO_CHAR(ДАТА_КОНТРАКТА, 'dd.mm.yyyy'))

FROM ПРЕПОДАВАТЕЛИ

 

5. Создать запрос, позволяющий выводить информацию о студентах и преподавателях (Фамилия с инициалами, Зарплата/Стипендия, Статус – преподаватель или студент).

 

-- 'column_name' – мнимый столбец

SELECT ФАМИЛИЯ || ' ' || SUBSTR(ИМЯ, 0, 1) || '. ' || SUBSTR(ОТЧЕСТВО, 0, 1) || '.' "Фамилия И. О.",

стипендия "Зарплата/Стипендия",'СТУДЕНТ' "Статус"

FROM СТУДЕНТЫ

UNION

-- CAST нужен для перевода типа столбца к VARCHAR2(30), чтобы не было конфликта типов объединяемых столбцов

SELECT CAST(ФАМИЛИЯ || ' ' || SUBSTR(ИМЯ, 0, 1) || '. ' || SUBSTR(ОТЧЕСТВО, 0, 1) || '.' as VARCHAR2(30)),

ЗАРПЛАТА, 'ПРЕПОДАВАТЕЛЬ'

FROM ПРЕПОДАВАТЕЛИ

 

Фамилия И. О. Зарплата/Стипендия Статус

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

Абдулов С. А. 3000 Преподаватель

Викулина В. И. 3000 Преподаватель

Усов В. Х. 250 Студент

Устинов В. В. 250 Студент

18 rows selected

 

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

 

WITH

TBL AS (

SELECT ФАМИЛИЯ, ЗАРПЛАТА

FROM ПРЕПОДАВАТЕЛИ

-- сортируем зарплаты по убыванию

ORDER BY ЗАРПЛАТА DESC)

-- 3е высокооплачиваемых

SELECT * FROM TBL

WHERE rownum <= 3

UNION

-- и все у кого зарплата как у 3го

SELECT * FROM TBL

WHERE ЗАРПЛАТА = (-- зарплата 3го

SELECT ЗАРПЛАТА FROM TBL WHERE rownum <= 3

MINUS

SELECT ЗАРПЛАТА FROM TBL WHERE rownum <= 2)

 

ФАМИЛИЯ ЗАРПЛАТА

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

Абдулов 3000

Викулина 3000

Костыркин 4000

3 rows selected

 

7. Создать запрос для определения стажа работы преподавателей. Результат вывести в формате ## лет ## мес ## дней.

 

SELECT ФАМИЛИЯ "Фамилия", TRUNC((SYSDATE-ДАТА_КОНТРАКТА)/365) || ' лет ' ||

TRUNC(MOD(SYSDATE-ДАТА_КОНТРАКТА, 12)) || ' мес ' ||

TRUNC(MOD(SYSDATE-ДАТА_КОНТРАКТА, 31)) || ' дней' "Стаж"

FROM ПРЕПОДАВАТЕЛИ

 

Фамилия Стаж

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

Костыркин 14 лет 4 мес 17 дней

Викулина 14 лет 8 мес 22 дней

Позднякова 33 лет 9 мес 10 дней

Тарасова 31 лет 0 мес 13 дней

9 rows selected

 

8. Создать представление для вывода фамилии преподавателя, должности и зарплаты. Представление должно гарантировать, что пользователь не сможет ввести отрицательное значение зарплаты и зарплату, большую 50000.

 

CREATE VIEW VIEW_PREP AS

SELECT ФАМИЛИЯ "Фамилия", ДОЛЖНОСТЬ "Должность", ЗАРПЛАТА "Зарплата"

FROM ПРЕПОДАВАТЕЛИ

WHERE зарплата BETWEEN 0 AND 50000

-- WITH CHECK OPTION - соблюдать ограничение WHERE

WITH CHECK OPTION

 

Фамилия Должность Зарплата

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

Костыркин Профессор 4000

Викулина Доцент 3000

Соколов Ассистент 1500

Казанко Преподаватель 2000

Абдулов Доцент 3000

Студейкин Доцент 2500

Загарийчук Ассистент 2000

Позднякова Преподаватель 2500

Тарасова Преподаватель 2000

9 rows selected

 

9. Создать представление, которое выводит фамилию студента, оценку, дату сдачи экзамена и название предмета. Оценка должна выводиться в формате: отл, хор, удовл или неудовл. Для студентов, не сдававших экзамен, должно выводиться – Не сдавал – в столбцах Оценка, Дата сдачи экзамена и Название предмета.

 

CREATE VIEW VIEW_OCENKI AS

SELECT s.ФАМИЛИЯ "Фамилия",

DECODE(TO_CHAR(u2.ОЦЕНКА), '5', 'Отлично', '4', 'Хорошо', '3', 'Удовлетворительно', '2', 'Плохо', 'Не сдавал') "Оценка",

t.ДАТА "Дата сдачи экзамена", t.НАЗВАНИЕ "Предмет"

FROM УСПЕВАЕМОСТЬ u2 RIGHT JOIN (

УЧЕБНЫЕ_ПЛАНЫ u1 INNER JOIN (

СТУДЕНТЫ s INNER JOIN ГРУППЫ g

ON s.НОМЕР_ГРУППЫ = g.НОМЕР_ГРУППЫ)

ON g.КОД_СПЕЦИАЛЬНОСТИ = u1.КОД_СПЕЦИАЛЬНОСТИ)

ON s.НОМЕР_СТУДЕНТА = u2.НОМЕР_СТУДЕНТА AND u2.НОМЕР_ДИСЦИПЛИНЫ = u1.НОМЕР_ДИСЦИПЛИНЫ

LEFT JOIN (

SELECT DISTINCT u3.ДАТА, u3.НОМЕР_ДИСЦИПЛИНЫ, d.НАЗВАНИЕ

FROM УСПЕВАЕМОСТЬ u3 INNER JOIN ДИСЦИПЛИНЫ d

ON u3.НОМЕР_ДИСЦИПЛИНЫ = d.НОМЕР_ДИСЦИПЛИНЫ) t

ON u1.НОМЕР_ДИСЦИПЛИНЫ = t.НОМЕР_ДИСЦИПЛИНЫ

ORDER BY 1

 

Фамилия Оценка Дата сдачи экзамена Предмет

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

Гриценко Не сдавал 12.06.99 Математика

Гриценко Плохо 10.06.99 Физика

Ежов Не сдавал 18.06.99 Менеджмент

Устинов Не сдавал 18.06.99 Менеджмент

Устинов Плохо 12.06.99 Математика

22 rows selected

 

10. Создать запрос для получения списка дисциплин, которые изучаются на всех специальностях.

SELECT НАЗВАНИЕ

FROM ДИСЦИПЛИНЫ

WHERE НОМЕР_ДИСЦИПЛИНЫ = ANY (

SELECT n

FROM (

-- число совпадающих номеров дисциплин (на разных специальностях)

SELECT COUNT(КОД_СПЕЦИАЛЬНОСТИ) k, НОМЕР_ДИСЦИПЛИНЫ n

FROM УЧЕБНЫЕ_ПЛАНЫ

GROUP BY НОМЕР_ДИСЦИПЛИНЫ)

WHERE k = (

-- число различных изучаемых дисциплин

SELECT COUNT(DISTINCT КОД_СПЕЦИАЛЬНОСТИ)

FROM УЧЕБНЫЕ_ПЛАНЫ))

 

НАЗВАНИЕ

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

Математика

1 rows selected

 

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

 

SELECT ФАМИЛИЯ, СТИПЕНДИЯ,

-- SUM(СТИПЕНДИЯ) OVER(PARTITION BY НОМЕР_ГРУППЫ) -суммарная стипендия студентов по группе

ROUND(СТИПЕНДИЯ*100/(SUM(СТИПЕНДИЯ) OVER(PARTITION BY НОМЕР_ГРУППЫ))) || '%' Процент

FROM СТУДЕНТЫ

 

ФАМИЛИЯ СТИПЕНДИЯ ПРОЦЕНТ

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

Поляков 200 27%

Старова 250 33%

Улиткин 225 53%

Ежов 200 47%

9 rows selected

 

12. Создать запрос для получения информации о количестве полученных студентами пятерок, четверок, троек и двоек. Результат запроса должен быть представлен в виде:

 

WITH

TBL AS (

SELECT S.ФАМИЛИЯ "Фамилия",

SUM(DECODE(U.ОЦЕНКА, 5, 1, 0)) "Кол-во 5",

SUM(DECODE(U.ОЦЕНКА, 4, 1, 0)) "Кол-во 4",

SUM(DECODE(U.ОЦЕНКА, 3, 1, 0)) "Кол-во 3",

SUM(DECODE(U.ОЦЕНКА, 2, 1, 0)) "Кол-во 2",

SUM(DECODE(U.ОЦЕНКА, 5, 1, 4, 1, 3, 1, 2, 1, 0)) "Итого"

FROM СТУДЕНТЫ S JOIN УСПЕВАЕМОСТЬ U

ON (S.НОМЕР_СТУДЕНТА = U.НОМЕР_СТУДЕНТА)

GROUP BY ФАМИЛИЯ)

SELECT *

FROM TBL

UNION ALL

SELECT 'Итого:', SUM("Кол-во 5"), SUM("Кол-во 4"), SUM("Кол-во 3"), SUM("Кол-во 2"), SUM("Итого")

FROM TBL

 

Фамилия Кол-во 5 Кол-во 4 Кол-во 3 Кол-во 2 Итого

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

Нагорный 1 0 0 0 1

Устинов 0 0 0 1 1

Гриценко 0 0 1 1 2

Усов 1 1 1 0 3

Старова 2 0 0 0 2

Поляков 1 1 0 0 2

Итого: 5 2 2 2 11

7 rows selected

 

13. Создать запрос для получения информации о кафедрах в виде:

  Кол-во сотрудников Средняя зарплата Максимальная зарплата
Кафедра1      
Кафедра2      
В целом:      

 

SELECT NVL(КАФЕДРА,'В целом:'),

COUNT (*) "Кол-во сотрудников",

AVG (ЗАРПЛАТА) "Средняя зарплата",

MAX (ЗАРПЛАТА) "Максимальная зарплата"

FROM ПРЕПОДАВАТЕЛИ

-- ROLLUP подсчитает итог по кафедрам

GROUP BY ROLLUP(КАФЕДРА)

 

NVL(КАФЕДРА,'ВЦЕЛОМ:') Кол-во сотрудников Средняя зарплата Максимальная зарплата

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

Кафедра 1 4 2625 4000

Кафедра 2 5 2400 3000

В целом: 9 2500 4000

3 rows selected

 

14. Создать запрос для получения информации о фамилиях преподавателей, должностях преподавателей, фамилиях их начальников и должностях начальников.

 

SELECT P1.ФАМИЛИЯ "Преподаватель", P1.ДОЛЖНОСТЬ "Должность преподавателя", P2.ФАМИЛИЯ "Фамилия начальника", P2.ДОЛЖНОСТЬ "Должность начальника"

FROM ПРЕПОДАВАТЕЛИ P1

JOIN ПРЕПОДАВАТЕЛИ P2 ON P1.НОМЕР_ПРЕПОДАВАТЕЛЯ = P2.ПОДЧИНЯЕТСЯ

 

Преподаватель Должность преподавателя Фамилия начальника Должность начальника

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

Викулина Доцент Соколов Ассистент

Костыркин Профессор Викулина Доцент

Абдулов Доцент Тарасова Преподаватель

Абдулов Доцент Студейкин Доцент

7 rows selected

 

15. Удалить из таблицы Преподаватели всех преподавателей, которые подчиняются Викулиной (непосредственно и опосредованно).

 

DELETE FROM ПРЕПОДАВАТЕЛИ

WHERE НОМЕР_ПРЕПОДАВАТЕЛЯ IN (

SELECT НОМЕР_ПРЕПОДАВАТЕЛЯ

FROM ПРЕПОДАВАТЕЛИ

-- определяем записи подчиненных

WHERE ФАМИЛИЯ!= 'Викулина'

START WITH ФАМИЛИЯ = 'Викулина'

CONNECT BY PRIOR НОМЕР_ПРЕПОДАВАТЕЛЯ = ПОДЧИНЯЕТСЯ);

ROLLBACK

 

2 rows deleted

 


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

 

SELECT MAX(s)

FROM (

SELECT s

FROM DUAL

MODEL

DIMENSION BY (0 d)

MEASURES ('&string' s)

-- 10 раз заменяем все вхождения двойных пробелов на одинарный

RULES ITERATE (10) (

s[iteration_number+1] = REPLACE(s[iteration_number], ' ', ' ')))

 

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

Номер отдела Название отдела Количество сотрудников Средний оклад Фамилия Оклад Должность
  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 nvl(id1, 0) "Номер отдела", nvl(dn, ' ') "Название отдела",

nvl(cnt, 0) "Количество сотрудников", nvl(av, 0) "Средняя зарплата",

nvl(ln, ' ') "Фамилия сотрудника", nvl(sal, 0) "Оклад", nvl(jt, ' ') "Должность"

FROM (

SELECT d.department_id id1, d.department_name dn,

COUNT(e.last_name) OVER (PARTITION BY d.department_id) cnt,

AVG(e.salary) OVER (PARTITION BY d.department_id) av,

e.last_name ln, e.department_id id2, e.salary sal, j.job_title jt

FROM employees e LEFT JOIN departments d ON e.department_id = d.department_id

INNER JOIN jobs j ON e.job_id = j.job_id)

GROUP BY GROUPING SETS((id1, dn, cnt, av),(ln, id2, sal, jt))

ORDER BY (CASE WHEN id1 IS NULL THEN id2 ELSE id1 END), id

 

Номер отдела Название отдела Колво сотрудников Средняя зарплата Фамилия сотрудника Оклад Должность

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

10 Administration 1 4400 0

0 0 0 Whalen 4400 Administration Assistant

20 Marketing 2 9500 0

0 0 0 Fay 6000 Marketing Representative

0 0 0 Gietz 8300 Public Accountant

0 0 0 Grant 7000 Sales Representative

0 1 7000 0

119 rows selected

 

18. В произвольной строке, состоящей из символьных элементов, разделенных запятыми, отсортировать элементы по алфавиту. Например, символьную строку

abc,cde,ef,gh,mn,test,ss, df,fw,ewe,wwe

преобразовать к виду:

abc,cde,df,ef,ewe, fw,gh,mn,ss,test,wwe.

 

-- WM_CONCAT(column) - объединяет значения полей column в одну строку (поле) с разделителем ‘,’

SELECT WM_CONCAT(s) "abc,cde,ef, gh,mn,test, df"

FROM (

SELECT LTRIM(s) ts, s

FROM (-- выделение непустых подстрок между запятыми

-- REGEXP_SUBSTR('str', '[^,]+', start_index, num)

-- возвращает num вхождение подстроки соответсвующей шаблону из 'str', начиная со start_index

-- '[^,]+' - все символы между разделителями - ','

SELECT REGEXP_SUBSTR('abc,cde,ef, gh,mn,test, df', '[^,]+', 1, level) s

FROM DUAL

-- INSTR('str', 'sub', start_index, num)

-- ищет индекс num по счету вхождения 'sub' в 'str', начиная со start_index

CONNECT BY INSTR('abc,cde,ef, gh,mn,test, df', ',', 1, level - 1) > 0)

ORDER BY 1)

 

abc,cde,ef, gh,mn,test, df

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

abc,cde, df,ef, gh,mn,test

1 rows selected

 

19. Выделить в 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>

 

SELECT REGEXP_SUBSTR(txt,'.*<p class="content">.*', 1, level) "<p class=content>*",

REGEXP_SUBSTR(txt,'.*<li class="content">.*', 1, level) "<li class=content>*"

FROM (

SELECT '<p>Абзац 1</p>

<p class="content">Абзац 2</p>

<ul>

<li>Элемент 1</li>

<li class="content">Элемент 2</li>

</ul>' txt

FROM DUAL)

-- до тех пор пока обе подстроки не будут найдены

CONNECT BY REGEXP_SUBSTR(txt,'.*<p class="content">.*', 1, level) IS NOT NULL

OR REGEXP_SUBSTR(txt,'.*<li class="content">.*', 1, level) IS NOT NULL

 

<p class=content>* <li class=content>*

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

<p class="content">Абзац 2</p> <li class="content">Элемент 2</li>

1 rows selected

 

20. Создать запрос для получения списка городов и отделов, расположенных в них. Результаты представить в виде:

Город Отдел
Seattle Accounting, Administration,Benefits, Construction,Control And Credit
Toronto Marketing
   

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

 

-- WM_CONCAT - склеиваем значения из группы через запятую

SELECT c "Город", REPLACE(WM_CONCAT(dn), ',', ', ') "Отделы"

FROM (

SELECT l.CITY c, d.DEPARTMENT_NAME dn

FROM DEPARTMENTS d INNER JOIN LOCATIONS l

ON d.LOCATION_ID = l.LOCATION_ID

ORDER BY 1)

-- группировка по городам

GROUP BY c

 

Результат:

 

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


 


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


<== предыдущая страница | следующая страница ==>
Main_Table PK User_Constraints 23 страница| Женские архетипические сюжеты

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