2016-09-18 3 views
0

У меня есть 2 запроса с приведенным ниже набором результатов ... Первый набор результатов для студентов, поэтому все столбцы, относящиеся к инструкторам, равны нулю. Второй результирующий набор имеет значение инструкторов и столбцов, связанных со студентами равны нулю, и оба они разделяют несколько общих столбцов .. Слушатель:Как объединить результаты Объединения Все в Oracle

uid f_name m_name l_name class school Section Dept. Branch Title 
1 abc c  dey 2  NYU 1 null null  null 
2 cde d  rey 3  CU  2 null null  null 
3 xyz r  mey 4  LSU 3 null null  null 

Учитель:

uid f_name m_name l_name class school Section Dept. Branch Title 
4 wss c  tey null null  null Science Biology Asso.Prof 
2 cde d  rey null null  null Arts  Music Asso.Prof 
5 rrr r  jey null null  null Science Chemistry Prof 

Если вы смотрите в приведенном выше наборе результатов, UID 2 общий в обоих наборах результатов, что в основном означает, что профессор может В то же время я одновременно студент ... Теперь я хочу объединить/объединить эти два запроса в общий набор результатов, например «Пользователи», которые в основном являются преподавателями и учениками.

Результирующий набор «Пользователи» должен быть уникальным по отношению к UID. Если я использовать объединение всех, будут дублироваться на UID 2. Мне нужен запрос, который может объединить столбцы для одной строки ... Набор должен быть результат:

1 abc c  dey 2  NYU 1 null null  null 
2 cde d  rey 3  CU  2 Arts Music  Asso.Prof 
3 xyz r  mey 4  LSU 3 null null  null 
4 wss c  tey null null  null Science Biology Asso.Prof 
5 rrr r  jey null null  null Science Chemistry Prof 

Примечание 2 выше, он имеет и студент и профессор подробно в одном ряду ...

Как я могу достичь этого в Oracle? Ценю вашу помощь.

+0

Я думаю, что СОЮЗ - это неправильный подход здесь. Каков источник ваших 2 запросов? Пожалуйста, покажите SQL. Либо есть одна таблица источников, в которой хранятся «люди» как с учащимися, так и с учителями, или у вас есть 2 разных таблицы для них, и это плохой дизайн. Существует два разных подхода к двум сценариям: я просто не знаю, какой из них выбрать, потому что вы не предоставили достаточной информации. –

+0

@ThomasG. 2 запроса - это сложные запросы на объединение, но оба используют общий источник, говоря «Лица». Но нет способа отличить, является ли человек учеником или учителем в этой таблице, он просто хранит человека и его данные. Это может быть плохой дизайн, но его уже поместили и использовали в миллионах других мест ... Скажем, есть еще 2 стола, ученики и учителя ... Поэтому внутреннее присоединение к ученику, людям и другой таблице, связанным со студентами, дает мне всех учеников Детали..Точно так же внутреннее соединение таблицы учителей с людьми, таблицы данных других людей дает мне все данные о преподавателях. –

+0

Посмотрите на полное внешнее соединение Студент с учителем на uid –

ответ

1

Как уже упоминалось в комментариях, это плохой дизайн (или, возможно, плохое решение, используя хороший дизайн). Если базовые таблицы являются «персоной» (содержащей только ту информацию, которая предназначена для студентов и преподавателей, таких как UID, имя, дата рождения, электронная почта и т. Д.), «Учащийся» (с UID как внешний ключ и показывающий только характеристики, характерные для студентов) и «учитель» (то же самое для учителей или преподавателей), тогда дизайн прекрасен, и желаемый конечный результат можно получить непосредственно из этих базовых таблиц, а не из результатов других запрошенных вами запросов. jva показывает что-то в этом направлении в своем ответе.

Если вы действительно должны с этим мириться, как использовать существующие запросы, чтобы использовать union all - но тогда вы должны group by uid, и для каждого столбца необходимо выбрать max(...) - например max(f_name) и max(school). Использование псевдонимов столбцов в предложении SELECT, например select .... , max(school) as school, ...

Или, чуть более эффективно (но с некоторыми рисками), group by id, f_name, m_name, l_name и выберите max(...) только для остальных столбцов. Риск состоит в том, что в одном месте m_name равен N, а в другом - null; то есть ваши данные внутренне непоследовательны. (Если все это происходит из одной базовой таблицы, «человек», то этого риска не должно быть.)

+0

Я изменил свое решение таким образом, что в вопросе один я присоединяюсь к ученикам с людьми, а также что возвращаемый UID не находится в таблице, связанной с инструктором. Таким образом, я уверен, что (ученик исключает только преподавателя) Союз (только учитель). Кажется, хорошо работает. Спасибо за ввод –

+0

Подход «union all» и 'group by' может быть быстрее, чем то, что вы описываете. Попробуйте в обоих направлениях и решите. Удачи! – mathguy

1

Это будет общий подход:

SELECT persons.id 
     ,nvl(<some_student_field>, <same_teacher_field) as some_common_field 
     ,... 
FROM persons 
    LEFT OUTER JOIN students on (person.id = students.person_id) 
    LEFT OUTER JOIN teachers on (person.id = teachers.person_id) 
WHERE <mandatory_field_for_students> IS NOT NULL 
    OR <mandatory_field_for_teachers> IS NOT NULL 
Смежные вопросы