Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите с решением  [new]
Skilur2016
Member

Откуда:
Сообщений: 5
Есть задание:
Запишите запросы для создания и заполнения таблиц (
create table users(user_id number default 0, name varchar2(50));
create table roles(role_name VARCHAR2(50));
create table dis (dis_id number default 0, name varchar2(50));
create table users_and_disc(user_id number, dis_id number, role_name varchar2(50));)

Реализуйте запрос который вернет название дисциплины и имя преподавателя, который ее ведет.
Если дисциплину ведут несколько преподавателей - вывести только одного из них.

Вот мое решение на данный момент:
select dis.name, t.name from dis left join
(select users.NAME, Tut.dis_id from users right join (
select user_id, dis_id from users_and_disc where role_name = 'Tutor') Tut on users.USER_ID = Tut.user_id) t
on dis.dis_id = t.dis_id order by dis.name;

Оно выводит всех преподавателей, а вот как сделать так, чтобы выводился один - ума не приложу. Задание к теме с ключевыми словами: ROLLUP, CUBE, GROUPING SET, GROUPING, GROUPING_ID, аналитические функции, оконные функции. Имеет ли смысл использовать GROUPING? И вообще не чересчур ли страшно написан сам запрос?
23 янв 16, 12:50    [18719797]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с решением  [new]
Elic
Member

Откуда:
Сообщений: 29976
Skilur2016
role_name = 'Tutor'
Интимная подробность, не описанная в ТЗ.
Skilur2016
вывести только одного из них.
аналитические функции, оконные функции
24 янв 16, 09:11    [18722094]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с решением  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34630
Elic,

а просто MIN ()еще можно
24 янв 16, 09:28    [18722108]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с решением  [new]
Elic
Member

Откуда:
Сообщений: 29976
MasterZiv
а просто MIN ()еще можно
Но в ключевых словах не значится.
24 янв 16, 10:38    [18722170]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с решением  [new]
Skilur2016
Member

Откуда:
Сообщений: 5
Elic, в таблице users_and_disc (Пользователи и дисциплины) есть поле role_name, где указывается: студент (Student) или преподаватель (Tutor). Надо выбрать преподавателей (Tutor'ов)
24 янв 16, 12:18    [18722290]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с решением  [new]
rekrabbe
Member

Откуда:
Сообщений: 30
Skilur2016
Есть задание:

Можно так, без всего выше перечисленного. Брать первого попавшегося препода.
with users(user_id, name) as
(select 1 as user_id, 'Петров' as name from dual
 union all
 select 2 as user_id, 'Сидоров' as name from dual),

dis(dis_id, name) as
(select 1 as dis_id, 'математика' as name from dual
 union all
 select 2 as dis_id, 'химия' as name from dual
 union all
 select 3 as dis_id, 'русский язык' as name from dual),

users_and_disc(user_id, dis_id, role_name) as
(select 1 as user_id, 1 as dis_id, 'Tutor' as role_name from dual
 union all
 select 2 as user_id, 1 as dis_id, 'Tutor' as role_name from dual
 union all
 select 3 as user_id, 1 as dis_id, 'Tutor' as role_name from dual
 union all
 select 2 as user_id, 3 as dis_id, 'Tutor' as role_name from dual)

select dis.name as dis_name
  , (select users.name from users
     join users_and_disc ud on ud.user_id = users.user_id
     where dis.dis_id = ud.dis_id
     and rownum <= 1) as user_name
from dis
25 янв 16, 16:21    [18726821]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с решением  [new]
Skilur2016
Member

Откуда:
Сообщений: 5
Всем спасибо, сам разобрался. Вот результат:

select dis.name dis_name, tut.name tut_name from dis right join
(select users.name, du.dis_id from users right join
(select dis_id, user_id, rank() over (partition by dis_id order by user_id) tr
from users_and_disc where role_name = 'Tutor') du on
users.USER_ID = du.user_id where du.tr = 1) tut on
tut.dis_id = dis.dis_id;

Да, куча join'ов, но суть не в этом. В таблице, где есть идентификационные номера (ИН) дисциплины и препода ранжируем их по дисциплинам в порядке преподов, соответственно всех преподов с номером больше 1 отбрасываем, а далее по их ИН находим их названия и джойним.
27 янв 16, 12:03    [18734922]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить