Как вывести несколько строк таблицы в одной строке?

MDesh
Дата: 28.10.2015 18:42:07
Всем привет.
Помогите, пожалуйста, оптимизировать запрос.
Есть 2 таблицы.

1 таблица
Имя Пол
Петя Мальчик
Даша Девочка

2 таблица (для упрощения примем, что уроков может быть только 2)
Имя Номер_урока Урок
Петя 1 Математика
Петя 2 Русский
Даша 1 Английский
Даша 2 Физкультура

Нужно вывести одной строкой следующий результат:
Имя Пол Номер_урока_№1 Урок_№1 Номер_урока_№2 Урок_№2
Петя Мальчик 1 Математика 2 Русский
Даша Девочка 1 Английский 2 Физкультура

1. Можно в FROM объявить таблицу №2 2 раза и в селекте выводя урок №1 ссылаться на таблицу 2_1 (прописав в условии что из таблицы 2_1 берем только первые уроки) и то же самое с уроком №2 (ссылаться на таблицу 2_2).
2. Можно в селекте на каждый урок сделать по подзапросу, в каждом из которых будет таблица №2 и условие про номер урока.

Но это нагромождает запрос. Либо дополнительные селекты, либо дополнительные таблицы.
Можно ли как то еще по другому решить задачку?
Желательно, чтобы вопрос решался на distinctом (чтобы не выводить нужный нам результат 2 раза, а потом удалять дубликаты - это все дополнительное время) и не через case (потому что все равно будет выводиться вторая строка, да еще и с нулевыми значениями либо по 1 либо по 2 уроку).
Хотя я рассмотрю любые варианты.
Спасибо!
Elic
Дата: 28.10.2015 18:55:43
MDesh
Хотя я рассмотрю любые варианты.
Т.е. милостиво разрешаешь отвечать?
RTFM/STFF pivot
нормаль формаль
Дата: 28.10.2015 19:11:10
MDesh
Номер_урока_№1
избыточная информация ведет к ошибкам, ну и к издевкам...
MDesh
Дата: 29.10.2015 11:31:26
Elic,

это означает, что я могу неправильно использовать те или иные операторы или конструкции. Поэтому да, я готов рассмотреть любые варианты, даже те, от которых я вроде как отказался.
Всегда делал либо подзапросами, либо объявлением второй точно такой же таблицы.
А тут вот решил по умному научиться делать.
Если бы я нашел то, что мне нужно в гугле или на форуме - я бы не написал этот пост.
MDesh
Дата: 29.10.2015 11:35:12
нормаль формаль,

это пример, который с ходу пришел мне в голову. Данных гораздо больше, при это все они нужны (потому что, например, по ним идет связь с другими таблицами в базе). Вопрос не в лишних данных. А в способе вывести такой результат.
ArtNick
Дата: 29.10.2015 12:08:28
MDesh
Если бы я нашел то, что мне нужно в гугле или на форуме - я бы не написал этот пост.

Искал и не нашел. жми
EDUARD_2
Дата: 29.10.2015 15:59:34
MDesh,

кол-во уроков ведь фиксировано и максимум 6-7?

тогда тебе сюда http://www.sql.ru/faq/faq_topic.aspx?fid=210
EDUARD_2
Дата: 29.10.2015 16:01:20
ArtNick,

на даче тоже бульдозером грядки вспахиваешь?
ArtNick
Дата: 29.10.2015 16:14:22
EDUARD_2,
Обоснуй, пожалуйста, почему pivot это бульдозер?
Alhymik
Дата: 30.10.2015 02:54:54
ArtNick, попробуй тоже самое написать с пивотом
with t1  as (
select 'Петя' name, 'Мальчик' gender from dual union all
select 'Даша', 'Девочка' from dual 
),
t2 as (
select 'Петя' name, 1 less_num, 'Математика' lesson from dual union all
select 'Петя', 2, 'Русский' from dual union all
select 'Даша', 1, 'Английский' from dual union all
select 'Даша', 2, 'Физкультура' from dual
)
select t1.name, gender, 
       1 less_num_1, max(decode(less_num, 1, lesson)) lesson_1, 
       2 less_num_2, max(decode(less_num, 2, lesson)) lesson_2
from t1, t2
where t1.name = t2.name
group by t1.name, gender